从C++ C++中删除特殊对象

从C++ C++中删除特殊对象,c++,vector,erase,C++,Vector,Erase,我有一个int向量 vector<int> p; 但这段代码没有编译。它说函数不接受3个参数。使用 向量擦除方法需要一个或两个迭代器。第一个,从指定的位置到结束擦除所有内容。 remove from将所有匹配的元素移动到序列的末尾,并将迭代器返回到新端点的位置。您可以使用此迭代器进行擦除。 如果要删除第一个匹配元素,请使用std::find检索第一个元素的迭代器,并将其传递给erase。使用std::vector::erase与std::find组合使用 您可以在此处查看文档: 如

我有一个int向量

vector<int> p;
但这段代码没有编译。它说函数不接受3个参数。

使用

向量擦除方法需要一个或两个迭代器。第一个,从指定的位置到结束擦除所有内容。 remove from将所有匹配的元素移动到序列的末尾,并将迭代器返回到新端点的位置。您可以使用此迭代器进行擦除。 如果要删除第一个匹配元素,请使用std::find检索第一个元素的迭代器,并将其传递给erase。

使用std::vector::erase与std::find组合使用

您可以在此处查看文档:

如果在算法下找到,请使用remove_

给定一个开始和结束迭代器以及一个谓词,您可以删除导致谓词计算为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的任何问题,我都会亲自咨询并向我们展示您至少尝试过的内容。很明显,你们并没有正确地使用它,因为它确实需要3个论证。很简单,只要看看第一个答案是什么。或者继续向下voting一个好的答案不会让你的问题变得更好。这会删除向量中的所有5吗?是的,如果你想删除第一个事件,你可能想使用std::find作为橡皮擦的输入。好吧,引用这个问题-现在我想删除其中一个等于3的项目。强调mine@hansmaad函数不接受3个参数,也没有find函数。我包括向量并使用名称空间std@MHabibi如果std中没有find函数,则说明编译器已损坏。@MHabibi顺便说一句,您是否费心按照链接查看示例?我已经看到了。他们两个。并复制了它们。但它不起作用。我使用的是visual studio 2010,这有点过头了。为什么要在需要精确匹配时使用谓词?这适用于任何需要根据某些条件删除的情况。这仅仅建立了一个可以重用以满足进一步需求的框架。
#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;
}
#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;
}