私は既存のvector
要素のコピーをそれを倍増させるために挿入しようとしています。次のコードは、以前のバージョンで働いていたが、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
でのVisual Studioで失敗し、1 1 2
を期待しました。
なぜそれが起こっているのかわかりました。ベクトルが再割り当てされ、参照が無効になって挿入ポイントにコピーされます。旧式のVisual Studioは明らかに異なる順序で動作していたため、未定義の動作の1つの可能な結果は、正しく動作することと、それが決して頼りになるものではないことが証明されています。
私はこの問題を解決する2つの方法を考え出しました。一つは何の再割り当てが行われないことを確認する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 previewは最初の例で '1 1 2'を返します。 –
@Jesse、それは私を驚かさない。 'insert'のRvalueオーバーロードが選択されました。これは修正されたバグのようです。コードは、そのオーバーロードとconst参照を受け取るものとでは全く異なります。 –
intへのキャストは機能しますか? –