web-dev-qa-db-ja.com

C ++ STLベクトルの特定の要素を変更する方法

_vector<int> l;
for(int i=1;i<=10;i++){
   l.Push_back(i);
}
_

さて、たとえば、ベクターの_5th element_を_-1_?に変更するにはどうすればよいですか

l.assign(4, -1);を試してみましたが、期待どおりに動作しません。他のベクトル法はどれも当てはまらないようです。

コードでランダムアクセス機能が必要なため、ベクトルを使用しました(l.at(i)を使用)。

42
Moeb

atおよびoperator[]は両方ともインデックス付き要素への参照を返すため、単純に使用できます。

l.at(4) = -1;

または

l[4] = -1;
104
James McNellis

@JamesMcNellisの回答は有効なものですが、エラー処理と、希望することを行う別の方法があることについても説明したいと思います。

ベクター内の特定のアイテムにアクセスするには、4つの方法があります。

  • []演算子を使用する
  • メンバー関数at(...)を使用する
  • 指定されたオフセットと組み合わせてイテレータを使用する
  • 標準C++ライブラリのalgorithmヘッダーからstd::for_eachを使用します。これは私が推奨できる別の方法です(内部的にイテレータを使用します)。たとえば here のように詳細を読むことができます。

次の例では、次のベクターを実験用ラットとして使用し、最初の3つの方法を説明します。

static const int arr[] = {1, 2, 3, 4};
std::vector<int> v(arr, arr+sizeof(arr)/sizeof(arr[0]));

これにより、次のようなベクターが作成されます。

1 2 3 4

まず、[]の方法を見てみましょう。通常の配列を操作する場合に予想されるのとほぼ同じように機能します。インデックスを指定し、場合によっては、必要なアイテムにアクセスします。 []演算子は、ベクターが実際にその数のアイテムを持っているかどうかをチェックしないため、おそらくと言います。これにより、サイレント無効なメモリアクセスが発生します。例:

v[10] = 9;

これにより、即時クラッシュが発生する場合と発生しない場合があります。最悪の場合はもちろん、そうでない場合であり、実際に有効な値と思われるものを取得します。配列と同様に、これは、たとえば1000行のコードで100ではなく234の値を取得する理由を見つけるための無駄な時間につながる可能性があります。

より良い方法は、at(...)を使用することです。これにより、out of boundsの動作が自動的にチェックされ、std::out_of_rangeのスローが中断されます。だから私たちが持っている場合

v.at(10) = 9;

私たちは得るだろう:

'std :: out_of_range'のインスタンスをスローした後に呼び出された終了
what():vector :: _ M_range_check:__n(10)> = this-> size()(4)

3番目の方法は、物事を台無しにできるという意味で[]演算子に似ています。配列のようなベクトルは、同じタイプのデータを含む連続したメモリブロックのシーケンスです。つまり、開始アドレスをイテレータに割り当ててから、このイテレータにオフセットを追加するだけで開始アドレスを使用できます。オフセットは、最初に通過するアイテムの後にあるアイテムの数を表します。

std::vector<int>::iterator it = v.begin(); // First element of your vector
*(it+0) = 9;  // offest = 0 basically means accessing v.begin()
// Now we have 9 2 3 4 instead of 1 2 3 4
*(it+1) = -1; // offset = 1 means first item of v plus an additional one
// Now we have 9 -1 3 4 instead of 9 2 3 4
// ...

あなたが見ることができるように、私たちも行うことができます

*(it+10) = 9;

これも無効なメモリアクセスです。これは基本的にat(0 + offset)を使用する場合と同じですが、範囲外のエラーチェックはありません。

at(...)を可能な限り使用することをお勧めします。イテレータアクセスに比べて読みやすいだけでなく、オフセットの組み合わせを持つイテレータと[]演算子の両方について上記の無効なインデックスのエラーチェックのためです。

11
rbaleksandar

これはそれを行う必要があります:

l[4] = -1
6
Fred Larson

添字演算子 を使用できます

l[4] = -1
5
Tom

私は好む

l.at(4)= -1;

[4]はインデックスです

1
codexaxor