2016-08-28 132 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個元素。當然,'default '默認構造函數是無操作的,但這種方法仍然更容易出錯(如果不是每個元素都隨後被設置,則使用未初始化值的風險)。如果默認構造函數確實發生初始化元素,那麼這將是浪費。 – rustyx