2014-04-21 4 views
0

포인터 삽입 여부에 따라 값 삽입 방식이 다르게 작동합니다. 이 코드의 문제점은 무엇입니까? 첫 번째 for 루프는 포인터를 사용하여 세트에 삽입되고 두 번째 루프는 포인터가 없습니다. 그 외 모든 것은 완전히 동일합니다.std :: set 포인터에 삽입

#include <iostream> 
#include <set> 

using namespace std; 

typedef struct{ 
    int local; 
    int global; 
}Node; 
Node CreateNode(int global, int local) { 
    Node n; n.local=local; n.global=global; 
    return(n); 
} 
bool compare(Node a, Node b){ 
    a.global < b.global; 
} 

int main() 
{ 
    std::pair<std::set<Node>::iterator,bool> itr; 

    set<Node,bool(*)(Node,Node)> *graph_set_pointer = new set<Node,bool(*)(Node,Node)>(compare); 

    for(int i=10;i>0;--i){ 
    itr = graph_set_pointer->insert(CreateNode(i,i)); 
    cout << "global = " << i << " local = " << i ; 
    cout << " inserted_global = " << (*itr.first).global << endl; 
    } 

    cout << "Number of items in pointer set = " << graph_set_pointer->size() << "\n\n"; 

    set<Node,bool(*)(Node,Node)> graph_set_object(compare); 
    for(int i=10;i>0;--i){ 
    itr = graph_set_object.insert(CreateNode(i,i)); 
    cout << "global = " << i << " local = " << i ; 
    cout << " inserted_global = " << (*itr.first).global << endl; 
    } 

    cout << "Number of items in non pointer set = " << graph_set_object.size() <<"\n"; 

    delete graph_set_pointer; 

    return 0; 
} 

출력 :

global = 10 local = 10 inserted_global = 10 
global = 9 local = 9 inserted_global = 9 
global = 8 local = 8 inserted_global = 8 
global = 7 local = 7 inserted_global = 7 
global = 6 local = 6 inserted_global = 7 
global = 5 local = 5 inserted_global = 7 
global = 4 local = 4 inserted_global = 7 
global = 3 local = 3 inserted_global = 7 
global = 2 local = 2 inserted_global = 7 
global = 1 local = 1 inserted_global = 7 
Number of items in pointer set = 4 

global = 10 local = 10 inserted_global = 10 
global = 9 local = 9 inserted_global = 9 
global = 8 local = 8 inserted_global = 8 
global = 7 local = 7 inserted_global = 7 
global = 6 local = 6 inserted_global = 6 
global = 5 local = 5 inserted_global = 5 
global = 4 local = 4 inserted_global = 4 
global = 3 local = 3 inserted_global = 3 
global = 2 local = 2 inserted_global = 2 
global = 1 local = 1 inserted_global = 1 
Number of items in non pointer set = 10 
+0

근무중인 플랫폼은 무엇입니까? g ++ 4.7.3으로 정상적인 동작을보고 있습니다. –

+1

[이것이 당신이보아야하는 것입니까?] (http://ideone.com/17tuZs)? 코드에서 ideone.com으로 그대로 복사됩니다. – WhozCraig

+1

@WhozCraig [같음] (http://ideone.com/Lk1Hx2) – dasblinkenlight

답변

0

문제는 비교 결과를 반환하지 않는 비교() 함수가 될 수있다. 시도해보십시오 :

bool compare(Node a, Node b){ 
    return a.global < b.global; 
} 

향후에는 -Wall 매개 변수를 GCC (4.7.3)에 전달하는 것을 고려할 수 있습니다. 컴파일러는 그러한 실수에 대해 경고합니다. clang (3.2)은 기본적으로 VC++ (2010)에서 오류를 경고합니다.

+0

나 한테 얼마나 어리석은 지. 그것은 반환을 추가 한 후에 작동했지만 포인터가 아닌 포인터 및 dint 작업에 대해서는 여전히 이상합니다. 왜 그럴지 모른다고 생각 해요? – mvairavan

+0

@mvairavan - 값이 반환 될 것으로 예상되는 함수에 반환 값이 주어지지 않으면, 동작은'undefined'입니다. – PaulMcKenzie