私が持っているとしましょうvector<int> vals
。私はそれを繰り返し、値を絶対値に変更しています:
for (vector<int>::iterator it = vals.begin(); it != vals.end(); ++it) {
if (*it < 0) *it = -*it;
}
これは許可されていますか?サイズは変更vector<int>
しないので無効になるとは思いません。私は安全だと思います。これを確認したい。
私が持っているとしましょうvector<int> vals
。私はそれを繰り返し、値を絶対値に変更しています:
for (vector<int>::iterator it = vals.begin(); it != vals.end(); ++it) {
if (*it < 0) *it = -*it;
}
これは許可されていますか?サイズは変更vector<int>
しないので無効になるとは思いません。私は安全だと思います。これを確認したい。
はい、安全です。基盤となるストレージを変更していません。const
次のような関数のようにコンテナを渡すと、機能しないことに注意してください。
void doSomething(const vector<int>& vals)
このサイトはこれについてかなりよく話します:http ://www.cplusplus.com/reference/vector/vector/begin/
これは安全であり、シーケンスコンテナ(、、、array
などvector
)に使用できdeque
ます。
set
またはの場合multiset
、変更は許可されません(ただし、コンパイラーは、変更しようとするコードを拒否しない場合があります)。
amap
またはmultimap
の場合、キーを定数として扱う必要がありますが、そのキーに関連付けられた値を変更できます(同じことがunordered_
バリアントにも当てはまります)。
ちなみに、上記で使用したループの代わりにアルゴリズムを検討することをお勧めします。
std::transform(vals.begin(), vals.end(), vals.begin(), ::std::abs);