2013-07-04 99 views
-3

爲什麼我得到「分割故障(核心轉儲)」,當我這樣做:分配對在C++的矢量

std::vector<std::pair<int,int> > hm; 
hm[0] = pair<int,int> (1,1); 
+5

越界訪問 - >未定義的行爲。你的矢量是空的,你試圖訪問第一個元素。 –

+4

嘗試使用相同的代碼,但要簡化它 - 僅使用「int」而不是「pair」。你有相同的結果嗎?如果是這樣,這個問題不太可能與'pair's參與的事實有關: –

+0

要添加到Andy的評論中,請使用'push_back'或'emplace_back'而不是下標運算符。 – syam

回答

1

這個向量的初始大小爲0,operator[]不檢查範圍。你需要使用push_back方法(它會自動爲你增加一個向量的大小,而我的意思是元素的數量),或者給這個向量初始化一個構造函數重載的大小,如下所示:

std::vector<std::pair<int, int>> hm(5); 

或與resize方法。

+0

調整大小是我一直在尋找的!謝謝 –

5

載體不包含的元素與零的索引,它只是空。您應該添加一個新項目:

hm.push_back(pair<int,int>(1,1)); 
+2

並使用'std :: make_pair()',可能是 –

+1

或者:'hm.emplace_back(1,1);' –

+0

是的,但是如果我想添加到某個位置? –

0

當你寫

std::vector<std::pair<int,int> > hm; 

要創建載體,它,它不包含任何元素。在下一行,

hm[0] = std::pair<int,int> (1,1); 

你想分配給該向量無元素,這是不確定的行爲的第一個元素(和你的系統上發生造成分段錯誤,至少在案件你試過了)。如果你想趕上在運行時這樣的錯誤,你可以使用at,如

hm.at(0) = std::pair<int,int> (1,1); 

但是你得到這樣的唯一的事情是個例外,而不是不確定的行爲,它不解決根本問題,即你訪問一個根本不存在的對象。

現在有幾種方法來創建對象:

首先,你可以「按需」與push_back創建它:

hm.push_back(std::pair<int,int> (1,1)); 

這使得向量在最後追加的對象(因爲矢量最初是空的,所以這是之後唯一的元素,因此它是hm[0],並用你傳遞給push_back的值初始化它。

另一種方法是給矢量元素從一開始:

std::vector<std::pair<int,int> > hm(1); 
hm[0] = std::pair<int,int> (1,1); 

這裏的構造參數告訴向量立即創建(和默認初始化)一個元素。由於現在有第一個元素,您可以毫無問題地分配給它。但是請注意,默認初始化會花費一點性能,並且可能不適用於某些類型。

在特定的情況下,還可以觀察到,所有的元素都相等(因爲只有一個),因此,你可以使用這兩個參數的構造函數在這裏:

std::vector<std::pair<int,int> > hm(1, std::pair<int,int> (1,1)); 

在一個不相關的注意:不能std::pair<int, int>您可以使用std::make_pair並保存自己明確提及的類型。

0

如果您確實想讓[]的行爲與Python和Ruby中的行爲類似,那麼在hm[i] = j之前會使用if (hm.size() < i+1) { hm.resize(i+1); }