我試圖插入現有的vector
元素的副本來將其加倍。下面的代碼曾在以前的版本中,但在Visual Studio 2010失敗如何將重複元素插入到矢量中?
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char* argv[])
{
vector<int> test;
test.push_back(1);
test.push_back(2);
test.insert(test.begin(), test[0]);
cout << test[0] << " " << test[1] << " " << test[2] << endl;
return 0;
}
輸出是-17891602 1 2
,預計1 1 2
。
我已經知道爲什麼會發生這種情況 - 矢量正在被重新分配,並且在複製到插入點之前引用變爲無效。較早的Visual Studio顯然是以不同的順序做了事情,從而證明未定義行爲的一個可能結果是正確工作,並且證明它絕不是你應該依賴的東西。
我想出了兩種不同的方法來解決這個問題。一種是使用reserve
以確保沒有重新分配發生:
test.reserve(test.size() + 1);
test.insert(test.begin(), test[0]);
另一種是使從參考副本,以便有一個在參考其餘沒有依賴有效:
template<typename T>
T make_copy(const T & original)
{
return original;
}
test.insert(test.begin(), make_copy(test[0]));
雖然既工作,也沒有人覺得自然的解決方案。有什麼我失蹤?
BTW vc11 dev預覽給出了第一個例子中的'1 1 2'。 – 2012-04-18 21:28:54
@Jesse,這並不讓我感到意外。正在選擇'insert'的Rvalue重載,這看起來像是他們可能已經修復的錯誤。該代碼在超載和採用const引用的代碼之間完全不同。 – 2012-04-18 21:32:24
是否投射到int工作? – 2012-04-18 21:35:50