vector
既存の要素のコピーを挿入して 2 倍にしようとしています。次のコードは以前のバージョンでは機能しましたが、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 は明らかに異なる順序で処理を行っていたため、未定義の動作の結果の 1 つが正しく機能することであることが証明され、また、それが決して信頼できるものではないことも証明されました。
この問題を解決するために、2 つの異なる方法を考え出しました。reserve
1 つは、再割り当てが行われないようにするために使用する方法です。
test.reserve(test.size() + 1);
test.insert(test.begin(), test[0]);
もう 1 つは、参照が有効なままであることに依存しないように、参照からコピーを作成することです。
template<typename T>
T make_copy(const T & original)
{
return original;
}
test.insert(test.begin(), make_copy(test[0]));
どちらも機能しますが、どちらも自然な解決策とは思えません。足りないものはありますか?