5

私はC++が初めてで、これがstd::vectorに挿入する好ましい方法であるかどうか興味があります

std::vector<Object_I_madeup> myVector;

   void setAt(int x, Object_I_madeup o)
        {
            myVector[x] = o;

        } // set the array location at x  to be o.

push_backの使用、または非常に紛らわしいについて多くのことを目にするので、質問しますinsert()。このJavaのような方法は有効ですか? むしろそっちの方が…

4

5 に答える 5

11
myVector[x] = o;

の場合のみ明確に定義されx < myVector.size()ます。それ以外の場合は、ベクトルの範囲外の要素にアクセスしようとするため、undefined-behavior が呼び出されます。

境界外アクセスもチェックするようにしたい場合は、次のように使用at()します。

myVector.at(x) = o;

std::out_of_rangeの場合、例外がスローされますx >= myVector.size()try-catchしたがって、このコードをブロックに入れる必要があります。それらの違いについては、ここで詳しく説明します。

于 2012-08-30T19:37:59.900 に答える
2

myVector[x] = omyVector.push_back(o)を使用する(または を使用する)とはまったく異なることを行いinsertます。したがって、どの方法が正しいかは、何をしようとしているのかによって異なります。

  • myVector[x] = oベクトルには挿入しませんが、位置の要素を に置き換えxますo。したがって、 の長さはvector変化せず、以前の位置にあった値はもうxありませんvector。の長さmyVectorが大きくない場合、x境界外のアクセスが発生し、未定義の動作が発生します。
  • myVector.push_back(o)oの最後に挿入されmyVectorます。したがって、この操作の後、 の長さはvector1 増加し、 の最後の要素はmyVectorになりますo。から削除された値はありませんmyVector
  • myVector.insert(i, o)oiterator で指定された任意の位置に挿入しますi。したがって、ベクトルの長さは 1 増加し、"ith"要素 (要素番号myVector.begin() - i) はo
于 2012-08-30T19:52:48.007 に答える
1

ベクトルのサイズが x+1 以上の場合にのみ有効です。そうでない場合は、範囲外にアクセスしています。

次のようにベクトルを宣言すると:

std::vector<Object_I_madeup> myVector(10); // construct the vector with size 10
                                           // and default-initialize its elements

その後、インデックス 0 ~ 9 に安全にアクセスできます。この例のベクトルは空ですが、有効なインデックスはまだありません。

于 2012-08-30T19:37:24.923 に答える
1

範囲外にアクセスしようとしていない場合、つまりベクトル サイズが x より大きい場合に機能します。

于 2012-08-30T19:41:35.170 に答える
1

メソッドに相当するJavaのようなものを探している場合は、次のArrayList.set()方法でより厳密に行うことができます

void setAt(int x, Object_I_madeup o)
{
    myVector.at(x) = o;
}

vector::at()ベクトルが十分に大きくない場合、Java バージョンと同様に例外がスローされます。これにより、オブジェクトのコピーが作成されることに注意してください (関数にも値渡しを行っているため、実際には 2 つです)。

于 2012-08-30T19:42:49.800 に答える