vector<int> myVector;
そして、ベクトルの値がこれであるとしましょう(この順序で):
5 9 2 8 0 7
値 "8"を含む要素を消去したい場合は、次のようにします。
myVector.erase(myVector.begin()+4);
それは4番目の要素を消去するからです。しかし、値 "8"に基づいて要素を消去する方法はありますか?好きです:
myVector.eraseElementWhoseValueIs(8);
それとも、単にすべてのベクトル要素を反復処理してそれらの値をテストするだけでよいのでしょうか。
代わりに std::remove()
はどうでしょうか。
#include <algorithm>
...
vec.erase(std::remove(vec.begin(), vec.end(), 8), vec.end());
この組み合わせは、 erase-removeイディオム としても知られています。
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);
直接それはできません。消去する要素をベクトルの末尾に移動するにはstd::remove
アルゴリズムを使用してからerase
関数を使用する必要があります。 myVector.erase(std::remove(myVector.begin(), myVector.end(), 8), myVec.end());
のようなものです。詳しくは vectorから要素を消去する をご覧ください。
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