2012-08-30 7 views
5

を経由して、インデックスのベクトル私はC++に新たなんだ、これがSTDに挿入の好ましい方法である場合には興味があります::ベクトルはSTDへの挿入::代入演算子

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を使用したり、非常に混乱しているを使用することに関して多くのことを見ています。このJavaのような方法は有効ですか?私はむしろそのことをしたいと思います...

+2

あなたは*挿入*とはどういう意味ですかでしょうか?そのポジションの値を設定*していますか?あるいは、その場所の要素を他の要素に置き換えて挿入することを意味しますか? * insert *の使い方が分かりません。 –

答えて

10
myVector[x] = o; 

x < myVector.size()の場合にのみ定義されます。さもなければ、それはベクトルの境界から要素にアクセスしようとするため、未定義動作を呼び出します。今ではx >= myVector.size()場合std::out_of_range例外をスローします

myVector.at(x) = o; 

:あなたは、それはまた、アウトオブバウンドアクセスをチェックすることを確認するには

、その後、としてat()を使用しています。だからこのコードをtry-catchブロックに入れなければなりません!それらの違いについては、ここで詳しく説明します。

+0

ベクター上の 'insert' APIも、' at' APIと同様にこのアウトオブアウトバウンドアクセスチェックを行いますか? 'insert' APIは、int位置パラメータの代わりにイテレータ位置パラメータをとるという意味でユニークに見えます。私が実際にイテレータw.r.tを作成できるかどうかはわかりません。範囲外になるベクトルの位置。 – RBT

1

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

あなたはこのようにベクトルを宣言する場合:

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

、あなたが安全に、インデックスにアクセスすることができます0 - 例9. あなたのベクトルが、しかし、それへの有効なインデックスがまだ空でないです。

+0

つまり、インデックスが有効でない場合は、ベクトルのサイズが変更されません。 –

1

それはあなたがその範囲外のそれにアクセスしようとしていない場合には動作します、すなわち、ベクトルの大きさは、xよりも大きくなります。ベクトルがない場合は、ArrayList.set()メソッドのJavaに似同等を探しているなら

1

、あなたはJavaバージョンのような多くの

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

を経由して、より密接にそれを行うことができ、vector::at()は、例外がスローされます十分大きい。これは、オブジェクトのコピーを作成することに注意してください(実際には、値を関数に渡すので、実際は2つです)。

2

myVector[x] = omyVector.push_back(o)(またはinsertを使用)とはまったく異なるものを実行します。

  • myVector[x] = o

    は、ベクターに挿入されませんが、oとの位置xにある要素を置き換えます。そのために正しいとする方法あなたがやろうとしているかに依存します。したがって、vectorの長さは変更されず、以前は位置xにあった値はvectorにはもうありません。 myVectorの長さは、これは境界のアクセスのうちになりますxその後、大きななかった場合は、未定義の動作に
  • myVector.push_back(o)をリードすることはmyVectorの終わりにoを挿入します。したがって、この操作の後、vectorの長さは1増加し、myVectorの最後の要素はoになります。 myVectorから値が削除されていません。
  • myVector.insert(i, o)は、イテレータiで指定された任意の位置にoを挿入します。したがって、ベクトルの長さが1増加され、"ith"要素(要素番号myVector.begin() - i)はo