remove_if
以下で見つかった使用algorithm
begin および end イテレーターと述語を指定すると、述語の評価が true になる要素を削除できます。C++03 と C++11 の両方の例を含めます。
C++03:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
#include <cstdlib>
#include <ctime>
template <typename T>
struct
is_equal
{
T val;
is_equal (const T& v) : val (v) { }
bool
operator() (const T& test)
{
return (val == test);
}
};
struct
is_odd
{
bool
operator() (int test)
{
return (test % 2 == 1);
}
};
template <typename T>
std::ostream&
operator<< (std::ostream& os, const std::vector <T>& v)
{
typedef typename std::vector <T>::const_iterator itr;
for (itr i = v.begin (); i != v.end (); ++i)
os << *i << " ";
return os;
}
int
main (int argc, char* argv[])
{
srand (time (NULL));
std::vector <int> vec (10); // vector has size of 10
std::generate (vec.begin (), vec.end (), rand); // populate with random numbers
std::cout << vec << std::endl;
vec.erase (std::remove_if (vec.begin (), vec.end (), is_odd ()), // removes all odd elements
vec.end ());
std::cout << vec << std::endl;
return 0;
}
C++11:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>
#include <cstdlib>
template<typename T>
std::ostream&
operator<< (std::ostream& os, const std::vector <T>& v)
{
for (auto i : v)
os << i << " ";
return os;
}
int
main(int argc, char* argv[])
{
std::vector <int> vec(10); // vector has size of 10
std::iota (vec.begin(), vec.end(), 1); // populate with [1, 2, 3, ...]
std::cout << vec << std::endl;
vec.erase (std::remove_if (vec.begin(), vec.end(),
[](int i){ return (i == 3); }),
vec.end ());
std::cout << vec << std::endl;
return 0;
}
STL の使用に関する質問については、http://en.cppreference.com/w/およびhttp://www.cplusplus.com/reference/を個人的に参照してください。