2013-10-02 5 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.

Вы резерв больше места в векторах, но вы никогда не размер их. (Так ваш для цикла только вызывает неопределенное поведение, написав в конце прошлого векторов)

push_back растет размер вектора в 1, но если вы не называйте это, то вы должны вызвать resize и установить размер явно , (или указать размер как аргумент конструктора)

+0

Не понял. Итак, после того как я зарезервирую место, как мне получить к нему доступ? Поэтому я не могу вставить случайное положение? – user1715122

+0

@ user1715122 Вы можете прочитать о методе ['resize'] (http://en.cppreference.com/w/cpp/container/vector/resize). –

+0

, потому что, если я распечатываю значения opt [] или one [] from, скажем, от индекса '0' до '9', они не являются «0». Вы говорите, что это значения мусора? – user1715122

Смежные вопросы