既知の位置でC++ベクトルに挿入したいと思います。 C++ライブラリには、位置と挿入するオブジェクトを受け取るinsert()関数があることは知っていますが、位置タイプはイテレータです。特定のインデックスを使用して、配列に挿入するのと同じようにベクトルに挿入したいと思います。
そのデバッグトレースを見てください。最後に実行されるのはstd :: copy(__ first = 0x90c6fa8、__ last = 0x90c63bc、__ result = 0x90c6878)です。原因を振り返って、挿入位置を0x90c63bcとして挿入を呼び出しました。 std :: copyは、範囲[first、last)を結果にコピーします。これには、last-first要素用のスペースが必要です。この呼び出しは最後の<が最初であり、これは違法(!)なので、挿入する位置が間違っていると思います。 vnumがラインのどこかでアンダーフローしていないことを確認しますか?そのトレースが表示されているGDBでは、実行する必要があります
フレーム10
vnumを印刷する
チェックする。実際、質問を省略していない場合は、バグを見つけました。 2行目は次のとおりです。
new_mesh->Face(face_loc)->vertices.insert(vertices.begin()+vnum+1, new_vertices[j]);
それはすべきだった:
new_mesh->Face(face_loc)->vertices.insert(new_mesg->Face(face_loc)->vertices.begin()+vnum+1, new_vertices[j]);
最初の行は、頂点と呼ばれるいくつかのother変数の開始を基準にした挿入ポイントを示していますが、挿入する変数ではありません。
これはあなたが望むことをするはずです。
vector<int>myVec(3);
myVec.insert(myVec.begin() + INTEGER_OFFSET, DATA);
ベクトルが再割り当てされると、イテレータが無効になる可能性があることに注意してください。こちらをご覧ください サイト 。
編集:他の答えが消えた理由はわかりません...しかし、別の人が次のように何かを述べました:
myVec.insert(INDEX, DATA);
私が正しく覚えていれば、これは問題ないはずです。
これらをまとめることは常に素晴らしいことです。
template <typename T>
T& insert_at(T& pContainer, size_t pIndex, const T::value_type& pValue)
{
pContainer.insert(pContainer.begin() + pIndex, pValue);
return pContainer;
}
それはそれをする必要があります。インデックスからイテレータを作成できるという削除済みの回答がありますが、これまで見たことがありません。それが本当なら、それは間違いなく進むべき道です。私は今それを探しています。