2016-08-28 7 views
-3
#include<iostream> 
#include<vector> 
#include<algorithm> 
using namespace std; 
int main() 
{ 
    vector<pair<int,int> > arr; 
    arr[0].first=20,arr[0].second=1; 
    arr[1].first=3,arr[1].second=2; 
    arr[2].first=230,arr[2].second=3; 
    arr[3].first=230,arr[3].second=4; 
    arr[4].first=202,arr[4].second=5; 
    arr[5].first=-20,arr[5].second=6; 
    sort(arr.begin(),arr.end()); 
    vector<pair<int,int> >::iterator it; 
    for(it=arr.begin();it!=arr.end();it++) 
    { 
     cout<<it->first<<it->second<<endl; 
    } 
} 

Эта программа работает неправильно, что может быть причиной этого?
Также я хочу иметь отсортированный вектор пар, в котором сортировка выполняется значением.эта программа рушится, почему?

+0

[ 'vector > arr (6);'] (http://en.cppreference.com/w/cpp/container/vector/vector) должен устранить проблему. –

+2

И один вопрос за вопрос пожалуйста. –

+2

Когда вы создаете вектор, используя конструктор по умолчанию, вектор *** пуст ***. Любое индексирование будет за пределами границ и приведет к * неопределенному поведению *. –

ответ

3

Присвоение vector не выделяет память.
Обычно мы используем push_back для добавления элементов с автоматической памятью
. Код, как, что вы обычно пишут так:

arr.push_back(pair<int, int>(20, 1)); 
arr.push_back(pair<int, int>(3, 2)); 

и т.д ..

Но теперь с C++ 11 этот стиль кодирования стар.
Это можно сделать так (смотри также цикл):

arr.push_back({ 20, 1 }); 
arr.push_back({ 3, 2 }); 
sort(arr.begin(), arr.end()); 
for (auto p : arr) 
{ 
    cout << p.first << p.second << endl; 
} 

На самом деле, C++ 11 ставит некоторый удобный синтаксис в конструкторах:

vector<pair<int, int> > arr{ { 20, 1 }, { 3, 2 }, { 230, 3 }, 
{ 230, 4 }, { 202, 5 }, { -20, 6 } }; 
sort(arr.begin(), arr.end()); 
for (auto p : arr) 
{ 
    cout << p.first << ", " << p.second << endl; 
} 
+1

"vector >" - также в C++ 11 пространство между скобами закрывающего угла больше не требуется. Однако, 'template struct d; d <(1> 2)> x; '... –

0

В отличие от map::operator[], vector::operator[] никогда авто -включает новый элемент в контейнер. Неопределенное поведение для доступа к несуществующим элементам (в режиме отладки среда выполнения может вызывать утверждение, помогающее отладки).

В C++ 11 наиболее эффективных способов населяют вектора являются:

через инициализатора-лист:

vector<pair<int, int>> arr { 
    { 20, 1 }, { 3, 2 }, { 230, 3 }, 
    { 230, 4 }, { 202, 5 }, { -20, 6 } }; 

Или создавать записи в месте:

vector<pair<int, int>> arr; 
    arr.reserve(6); // optional, is just for efficiency 
    arr.emplace_back(20, 1); 
    arr.emplace_back( 3, 2); 
    arr.emplace_back(230, 3); 
    arr.emplace_back(230, 4); 
    arr.emplace_back(202, 5); 
    arr.emplace_back(-20, 6); 
+0

Почему не выделяет память через ctor и« самый эффективный »способ? – 5208760

+0

Вы имеете в виду 'arr (6);'? Это не просто выделяет память, но и по умолчанию создает 6 элементов. Разумеется, конструктор 'pair ' по умолчанию является no-op, этот подход все еще более подвержен ошибкам (риск использования неинициализированного значения, если не каждый последующий элемент). И если конструктор по умолчанию выполняет инициализацию элемента, это будет расточительно. – rustyx

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