-3

私はintのベクトルを持っています

vector<int> p;

ここで、3に等しいアイテムの1つを削除したいと思います。p.remove(3)のような削除はありません。

しかし、消去がありますが、最初はそれを見つける必要があります。stackoverflowで利用可能なこれについて2つの質問がありました。彼らは両方とも私たちがそれを見つけるべきだと言った

std::remove(p.begin(), p.end(), 3) 

しかし、このコードはコンパイルされていません。関数は3つの引数を取らないと言った。

4

3 に答える 3

2

EraseRemoveIdiomを使用します。

#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector> 

int main()
{
    using namespace std;
    vector<int> v = {1, 2, 3, 3, 4};

    v.erase(find(begin(v), end(v), 3));  // remove first 3
    // v.erase(remove(begin(v), end(v), 3), end(v));  // remove all 3

    copy(begin(v), end(v), ostream_iterator<int>(cout, " "));
}

Vectorseraseメソッドは1つまたは2つのイテレータを取ります。最初のものは、指定された位置から最後まですべてを消去します。 std::removefrom<algorithm>は、一致するすべての要素をシーケンスの最後に移動し、イテレータを新しい最後の位置に戻します。このイテレータはに使用できますerase。最初に一致する要素を削除する場合は、を使用std::findして最初の要素へのイテレータを取得し、それをに渡しeraseます。

于 2012-08-26T13:32:51.290 に答える
1

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/を個人的に参照してください。

于 2012-08-26T16:39:46.483 に答える
0

std::vector::eraseと組み合わせて使用​​しstd::findます。

ここでドキュメントを見ることができます:

于 2012-08-26T13:33:24.057 に答える