309
vector<int> myVector;

そして、ベクトルの値がこれであるとしましょう(この順序で):

5 9 2 8 0 7

「8」の値を含む要素を消去したい場合は、次のようにします。

myVector.erase(myVector.begin()+4);

それは4番目の要素を消去するからです。しかし、値「8」に基づいて要素を消去する方法はありますか?好き:

myVector.eraseElementWhoseValueIs(8);

または、単にすべてのベクトル要素を反復処理してそれらの値をテストする必要がありますか?

4

4 に答える 4

516

std::remove()代わりにどうですか:

#include <algorithm>
...
vec.erase(std::remove(vec.begin(), vec.end(), 8), vec.end());

この組み合わせは、 erase-removeイディオムとも呼ばれます。

于 2010-08-02T05:31:31.720 に答える
133

std::findイテレータを次の値に設定するために使用できます。

#include <algorithm>
std::vector<int>::iterator position = std::find(myVector.begin(), myVector.end(), 8);
if (position != myVector.end()) // == myVector.end() means the element was not found
    myVector.erase(position);
于 2010-08-02T05:31:06.013 に答える
13

直接それを行うことはできません。アルゴリズムを使用std::removeして、消去する要素をベクトルの最後に移動してから、erase関数を使用する必要があります。のようなもの:myVector.erase(std::remove(myVector.begin(), myVector.end(), 8), myVec.end());。詳細については、このベクトルからの要素の消去を参照してください。

于 2010-08-02T05:30:54.140 に答える
1

Eric Nieblerは範囲提案に取り組んでおり、いくつかのは特定の要素を削除する方法を示しています。削除8.新しいベクトルを作成します。

#include <iostream>
#include <range/v3/all.hpp>

int main(int argc, char const *argv[])
{
    std::vector<int> vi{2,4,6,8,10};
    for (auto& i : vi) {
        std::cout << i << std::endl;
    }
    std::cout << "-----" << std::endl;
    std::vector<int> vim = vi | ranges::view::remove_if([](int i){return i == 8;});
    for (auto& i : vim) {
        std::cout << i << std::endl;
    }
    return 0;
}

出力

2
4
6
8
10
-----
2
4
6
10

于 2016-03-02T11:21:13.037 に答える