2011-10-26 3 views
0

정렬해야하는 클래스에 포인터 배열이 있습니다. (포인터/값 전환

ITEM *items = new ITEM[set.pathc]; 
... 
bool change = true; 
while(change) 
{ 
change = false; 
for(i = 0; i < set.pathc-1; i++) 
{ 
    if(compare(items+i, items+i+1, set.order, set.order_asc)) 
    { 
     ITEM temp; 
     temp = *(items+i); 
     items[i] = items[i+1]; 
     items[i+1] = temp; 

     change = true; 
    } 
} 
} 

그래서 내 코드가 전환됩니다 단지 포인터 : 정렬은

내 코드가 같은입니다 ... 임 스위칭 그냥 클래스 또는 전체 클래스를 참조하는지 여부, 임 그냥 확실하지, 제대로 작동 개체가 할당 된 곳의 주소 나 전체 개체 (예 : 모든 개인 변수를 복사 할 때 "="연산자가 필요하지 않습니까?)? 나는 그것이 훨씬 더 빠른 것 같아요 때문에

내가 전환 할

그냥 내가이

ITEM *temp 
temp = item+i; 
item[i] = item+i+1; 
item[i+1] = temp; 

처럼 시도했지만 일을 일부러 포인터 : -/(I couldnt는 심지어 코드를 컴파일)

설명에 미리

감사합니다 :)

답변

0

당신은 개념을 혼합되어 temp는 포인터, items[i]는 ITEM입니다 items+i+1는 포인터이다.

물론
// creating items 
ITEMS **items = new ITEM*[set.pathc]; 
.... 
// for filling data 
for (i = 0; i < set.pathc; i++) 
{ 
    *(items + i) = new ITEM; // new ITEM in pointer 
    (*(items + i))->data = .....; 
} 

..... 
// compare and switching data 
if (compare(*(items + i), *(items + i + 1) .....) 
{ 
    ITEM *temp = *(items + i); 
    *(items + i) = *(items + i + 1); 
    *(items + i + 1) = temp; 
} 

, 당신은 지금과 같이 선언 할 수 있습니다 : 그래서 당신은 포인터를 사용하려는 경우, 좋은 코드가 있어야합니다

ITEM *items = new ITEM[set.pathc]; 

을하지만,이 경우, 스위칭 코드는 할 수 없습니다 배열에 포인터를 저장하지 않기 때문에 포인터로 처리하십시오.

문제가 많이 발생하지 않는 경우 동적 할당 오버 헤드 때문에 ITEM **을 사용하지 않는 것이 좋습니다.

+0

이미 코드를 다시 작성했지만 "동적 할당 오버 헤드"와 "ITEM * *'"을 사용하지 않는 이유를 알려주십시오. 이제 큰 메모리를 할당하는 데 문제가 있습니다. 'ITEM * * items; items = (ITEM * *) malloc (sizeof (ITEM * *) * set.pathc); (ITEM *) malloc (sizeof (ITEM)); \t * (items + i) = new_item; \t/* 항목 이름과 경로를 설정합니다. */ \t (* (items + i)) -> SetFullPath(); }' 및 mem 정렬 (-> 임시 -> 첫 번째, 임시 -> 초). 그러나 나는 그것의 천천히 추측한다. – Buksy

+0

일반적으로 동적 할당은 new/malloc을 사용하여 정상적인 스택 생성 및 복사 작업보다 오버 헤드를 발생시킵니다. 많은 항목을 가지고 있지 않다면 작업을 정렬 할 필요가 없기 때문에 컨테이너에서 스택 및 항목 복사 작업을 시도해 볼 수 있습니다. 그러나 항목 수가 너무 많고 컨테이너가 일반적으로 정렬되지 않은 경우 포인터를 전환하여 더 나은 성능을 얻습니다. –