2016-04-04 24 views
7

現在、私はベクター内のいくつかの要素を複製したいと考えています。容量は、最終的な容量よりも小さい場合、のstd ::ベクトルは、私の参照作り、その内部データのreallocをしなければならず、この場合には、そう同じベクトルのデータを参照してベクトルに挿入する

std::vector<MyStruct> v; 
// ... 
auto toDuplicate = std::find(v.begin(), v.end(), [](const MyStruct &s) { return true; /*In reality, a bit more complex*/ }); 
v.insert(toDuplicate, nrOfDuplicates-1, *toDuplicate); 
// Signature: insert(iterator, size_t, const value_type &) 

:一言で言えば、私のコードは次のようになります。挿入されたデータは無効です。

私が現在使用しているSTL(MSVC2013)の実装には、この種の挿入に対する保護が含まれています。これは、再割り当てが必要な場合、要素のコピーを実行するためです。しかし、私はこの行動に頼ることができるかどうか、または最初に自分自身でコピーを作成する必要があるかどうかはわかりません。 (私はむしろ、新しいSTL実装にアップグレードするときに、この種のバグを見ないようにしたい)

要するに、同じ要素内の要素への参照を持つベクトルにinsertベクター?

+0

私は愚かです。ごめんなさい。 – Slava

答えて

4

いいですよ。

あなたはテーブル99(シーケンスコンテナの要件)を見れば、あなたはa.insert(p,i,j)は(ijがイテレータである)前提条件を持っていることを、例えば、表示されます:「i、jはにイテレータではありません」。

しかし、a.insert(p,n,t)ここで、nはカウントであり、tはそのような要件がありません。

これはC++の11日間で問題として明示的に提起され、NADとして "vector::insert(iter, value)が標準で動作しないようにする必要があるため、NADとして閉じられました。

+0

'vector :: insert(iter、value)'は 'iterator insert(const_iterator pos、size_type count、const T&value)'とは異なります。 opに 'toDuplicate'の値への参照があり、再割り当てが起こっても、その参照は正しい要素を参照していますか? – NathanOliver

+0

@ NathanOliverはい、同じ理由から、動作しないという要件はありません。 –

+1

リファレンス:http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#526 – filipos

関連する問題