0

私は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のコンテナのみに固有のものですか、それとも他のコンテナにもこの問題がありますか?

4

1 に答える 1