6

私が持っているとしましょうvector<int> vals。私はそれを繰り返し、値を絶対値に変更しています:

for (vector<int>::iterator it = vals.begin(); it != vals.end(); ++it) {
    if (*it < 0) *it = -*it;
}

これは許可されていますか?サイズは変更vector<int>しないので無効になるとは思いません。私は安全だと思います。これを確認したい。

4

2 に答える 2

9

はい、安全です。基盤となるストレージを変更していません。const次のような関数のようにコンテナを渡すと、機能しないことに注意してください。

void doSomething(const vector<int>& vals)

このサイトはこれについてかなりよく話します:http ://www.cplusplus.com/reference/vector/vector/begin/

于 2012-12-17T19:19:32.067 に答える
6

これは安全であり、シーケンスコンテナ(、、、arrayなどvector)に使用できdequeます。

setまたはの場合multiset、変更は許可されません(ただし、コンパイラーは、変更しようとするコードを拒否しない場合があります)。

amapまたはmultimapの場合、キーを定数として扱う必要がありますが、そのキーに関連付けられた値を変更できます(同じことがunordered_バリアントにも当てはまります)。

ちなみに、上記で使用したループの代わりにアルゴリズムを検討することをお勧めします。

std::transform(vals.begin(), vals.end(), vals.begin(), ::std::abs);
于 2012-12-17T19:35:46.567 に答える