2013-10-02 1 views
0

의 벡터에 작동하지 않는 나는 다음과 같은 코드를 가지고 : 표준 : : 정렬() 쌍

struct compare { 
    bool operator()(const pair<size_t, double>& left, const pair<size_t, double>& right) { 
       return left.second > right.second; 
    } 
}; 

int main() { 
    size_t vertices = 31112738; 
    vector<pair<size_t, double> > opt, one; 
    opt.reserve(vertices); 
    one.reserve(vertices); 

    for(size_t i=0;i<vertices;i++) { 
     opt[i] = make_pair(i,rand()); 
     one[i] = make_pair(i,rand()); 
    } 

    sort(opt.begin(), opt.end(), compare()); 
    sort(one.begin(), one.end(), compare()); 

    return 0; 


} 

에도 정렬 함수를 호출 한 후, [] 선택 하나는 [] 정렬되지 않습니다. 그러나 push_back()을 사용하여 요소를 삽입 한 다음 sort() 함수를 호출하면 정렬됩니다.

두 시나리오에서 결과가 다른 이유는 무엇입니까? 시나리오에서 당신이 나와 있기 때문에

+2

'reserve'는 용량이 아니라 크기를 변경합니다. –

+0

컴파일하고 있습니다. – user1715122

+0

오 죄송 합니다만, 오타 ... – user1715122

답변

2

, 벡터는 항상 벡터의 크기가 0

당신 예약 더 많은 공간을 가지고,하지만 당신은 결코 그들을 크기를 조정하지 않습니다. (따라서 for-loop는 벡터의 끝을 지나서 작성하여 정의되지 않은 동작을 트리거합니다.)

push_back은 벡터의 크기를 1 씩 늘리지 만 호출하지 않으면 resize을 호출하고 명시 적으로 크기를 설정해야합니다 . (또는 생성자 인수로 크기를 지정하십시오)

+0

모르겠습니다. 그래서 공간을 예약 한 후에 어떻게 접근합니까? 그래서 임의의 위치에 삽입 할 수 없습니까? – user1715122

+0

@ user1715122 ['resize'] (http://en.cppreference.com/w/cpp/container/vector/resize) 방법에 대해 읽어보십시오. –

+0

opt [] 또는 one []의 값을 출력 할 때 인덱스 '0'에서 '9'까지를 출력하면 '0'이 아니기 때문입니다. 쓰레기 값이라고 말하는거야? – user1715122