2011-05-11 65 views
45

我正在寫一小段代碼,我必須將值插入到C++ STL向量中,取決於向量元素中的值。我正在使用insert()函數來完成此操作。我意識到,當我想在矢量的末尾添加一個新元素時,我可以簡單地使用push_back()。但爲了保持我的代碼看起來不錯,我想專門使用insert(),它將需要的插入點和要插入的值之後指向元素的迭代器作爲輸入。如果作爲參數傳入的迭代器的值是v.end(),其中v是我的向量,這是否與push_back()一樣?使用C++ vector :: insert()添加到向量的末尾

非常感謝!

+3

如果您發現自己在矢量中插入了很多內容,則可能是使用了錯誤的數據結構。考慮(例如)使用雙端隊列。當然,如果矢量很小,就沒有問題。 – 2011-05-11 07:59:01

+13

@尼克:是的。一個簡單的實驗可能會告訴你。 – 2011-05-11 07:59:13

+12

@Space我不明白一個實驗如何告訴他。如果無效,他會得到UB,在這種情況下,他的計劃似乎已經出現了。 – 2011-05-11 08:02:14

回答

77

a.push_back(x)定義爲對於支持它的序列容器具有與(void)a.insert(a.end(),x)相同的語義。

請參見ISO/IEC 14882:2003 23.1.1/12 [lib.sequence.reqmts]中的表68。

+1

快速問題,就性能而言,我想知道pusk_back工作更快?我測試了一些顯示插入緩慢的東西。我只是想確保...謝謝 – Saman 2016-02-08 20:14:43

+1

push_back()不會返回新插入元素的迭代器。 std :: list :: end()會返回一個死的迭代器。 – peterh 2016-06-15 23:46:39

14

有一個細微的差別,push_back返回void是否insert返回iterator剛剛插入的元素。

順便提一下,還有另一種方式來驗證他們是否做同樣的事情:編譯下面的代碼

int main() 
{ 
    std::vector<int const> v; 
    v.push_back(0); 
    return 0; 
} 

編譯器會打印很多惱人的消息,只是讀,你會發現push_back電話insert(如果不是,請嘗試編譯v.insert(v.end(), 0)以查看它們是否調用相同的插入函數)。