爲什麼我得到「分割故障(核心轉儲)」,當我這樣做:分配對在C++的矢量
std::vector<std::pair<int,int> > hm;
hm[0] = pair<int,int> (1,1);
爲什麼我得到「分割故障(核心轉儲)」,當我這樣做:分配對在C++的矢量
std::vector<std::pair<int,int> > hm;
hm[0] = pair<int,int> (1,1);
這個向量的初始大小爲0,operator[]
不檢查範圍。你需要使用push_back
方法(它會自動爲你增加一個向量的大小,而我的意思是元素的數量),或者給這個向量初始化一個構造函數重載的大小,如下所示:
std::vector<std::pair<int, int>> hm(5);
或與resize
方法。
調整大小是我一直在尋找的!謝謝 –
載體不包含的元素與零的索引,它只是空。您應該添加一個新項目:
hm.push_back(pair<int,int>(1,1));
並使用'std :: make_pair()',可能是 –
或者:'hm.emplace_back(1,1);' –
是的,但是如果我想添加到某個位置? –
當你寫
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
並保存自己明確提及的類型。
如果您確實想讓[]
的行爲與Python和Ruby中的行爲類似,那麼在hm[i] = j
之前會使用if (hm.size() < i+1) { hm.resize(i+1); }
。
越界訪問 - >未定義的行爲。你的矢量是空的,你試圖訪問第一個元素。 –
嘗試使用相同的代碼,但要簡化它 - 僅使用「int」而不是「pair」。你有相同的結果嗎?如果是這樣,這個問題不太可能與'pair's參與的事實有關: –
要添加到Andy的評論中,請使用'push_back'或'emplace_back'而不是下標運算符。 – syam