web-dev-qa-db-ja.com

c ++は既知の位置でベクトルに挿入します

既知の位置でC++ベクトルに挿入したいと思います。 C++ライブラリには、位置と挿入するオブジェクトを受け取るinsert()関数があることは知っていますが、位置タイプはイテレータです。特定のインデックスを使用して、配列に挿入するのと同じようにベクトルに挿入したいと思います。

18
myx

そのデバッグトレースを見てください。最後に実行されるのは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変数の開始を基準にした挿入ポイントを示していますが、挿入する変数ではありません。

5
Scott Wolchok

これはあなたが望むことをするはずです。

vector<int>myVec(3);
myVec.insert(myVec.begin() + INTEGER_OFFSET, DATA);

ベクトルが再割り当てされると、イテレータが無効になる可能性があることに注意してください。こちらをご覧ください サイト

編集:他の答えが消えた理由はわかりません...しかし、別の人が次のように何かを述べました:

myVec.insert(INDEX, DATA);

私が正しく覚えていれば、これは問題ないはずです。

21
nevets1219

これらをまとめることは常に素晴らしいことです。

template <typename T>
T& insert_at(T& pContainer, size_t pIndex, const T::value_type& pValue)
{
    pContainer.insert(pContainer.begin() + pIndex, pValue);

    return pContainer;
}

それはそれをする必要があります。インデックスからイテレータを作成できるという削除済みの回答がありますが、これまで見たことがありません。それが本当なら、それは間違いなく進むべき道です。私は今それを探しています。

9
GManNickG