私はstd::list<int>
とを持っていstd::vector<int>
ます。それらから偶数要素を削除し、それらの奇数要素を複製したい。
私はそれらの両方に2つの異なる機能を持っています:
ベクトル:
std::vector<int> vec_remove_even_duplicate_odd(std::vector<int> target) {
std::vector<int>::iterator begin = target.begin();
while (begin != target.end()) {
if (*begin % 2 == 0) {
begin = target.erase(begin);
} else {
begin = target.insert(begin, *begin);
begin += 2;
}
}
return target;
}
これはうまくいきます。しかし、同じ関数は次std::list<int>
の行にエラーを表示しますbegin += 2
:
error: no match for ‘operator+=’ (operand types are ‘std::list<int>::iterator {aka std::_List_iterator<int>}’ and ‘int’)
それを次のように変更すると:
begin = begin + 2
次のメモが表示されます。
note: mismatched types ‘const std::reverse_iterator<_Iterator>’ and ‘int’
しかし、その行を次のように変更すると:
++begin;
++begin;
それもうまくいきlist
ます。では、コンテナについて読んでいるときに見逃したかもしれない、この動作とは何でしょうか。
+=
の演算子が定義されていないのはなぜstd::list<T>::iterator
ですか? そして、なぜ単純な+
オペレーターにそのメッセージが表示されるのでしょうか? reverse_iterator
?も作成していません。
avector
は連続した構造ですが、alist
はそうではありません。しかし、ポストインクリメントが適用可能であることを考えると、それはどのように重要なのでしょうか? この問題は特定list
のコンテナのみに固有のものですか、それとも他のコンテナにもこの問題がありますか?