C++ 从矢量的矢量中删除重复的矢量

C++ 从矢量的矢量中删除重复的矢量,c++,c++11,vector,C++,C++11,Vector,我正在尝试实施在中发现的问题的解决方案 这是我的代码片段 bool compareVec(vector<int> a, vector<int> b) { return std::equal(a.begin(), a.end(), b.begin()); } vector<vector<int> > ans; ans.erase(std::remove_if(ans.begin(), ans.end(), compareVec), ans.e

我正在尝试实施在中发现的问题的解决方案

这是我的代码片段

bool compareVec(vector<int> a, vector<int> b) {
    return std::equal(a.begin(), a.end(), b.begin());
}
vector<vector<int> > ans;
ans.erase(std::remove_if(ans.begin(), ans.end(), compareVec), ans.end());
bool compareVec(向量a、向量b){
返回std::equal(a.begin(),a.end(),b.begin());
}
向量ans;
ans.erase(std::remove_if(ans.begin()、ans.end()、compareVec)、ans.end());
我得到以下错误

/usr/include/c++/4.8/bits/stl_algo.h: In instantiation of 
'_RandomAccessIterator std::__find_if(_RandomAccessIterator, 
_RandomAccessIterator, _Predicate, std::random_access_iterator_tag) [with 
_RandomAccessIterator = __gnu_cxx::__normal_iterator<std::vector<int>*, 
std::vector<std::vector<int> > >; _Predicate = bool (*)(std::vector<int>, 
std::vector<int>)]':

/usr/include/c++/4.8/bits/stl_algo.h:4465:41:   required from '_IIter   
std::find_if(_IIter, _IIter, _Predicate) [with _IIter = 
__gnu_cxx::__normal_iterator<std::vector<int>*, std::vector<std::vector<int>
 > >; _Predicate = bool (*)(std::vector<int>, std::vector<int>)]'

/usr/include/c++/4.8/bits/stl_algo.h:1144:64:   required from '_FIter 
std::remove_if(_FIter, _FIter, _Predicate) [with _FIter = 
__gnu_cxx::__normal_iterator<std::vector<int>*, std::vector<std::vector<int> 
> >; _Predicate = bool (*)(std::vector<int>, std::vector<int>)]'

solution.cpp:40:64:   required from here
/usr/include/c++/4.8/bits/stl_algo.h:214:23: error: too few arguments to    
function
if (__pred(*__first))
                   ^
/usr/include/c++/4.8/bits/stl_algo.h:218:23: error: too few arguments to   
function
if (__pred(*__first))
                   ^
/usr/include/c++/4.8/bits/stl_algo.h:222:23: error: too few arguments to 
function
if (__pred(*__first))
                   ^
/usr/include/c++/4.8/bits/stl_algo.h:在
“\u RandomAccessIterator std::\u查找\u如果(\u RandomAccessIterator,
_RandomAccessIterator,_谓词,std::RandomAccessIterator_标记)[带
_RandomAccess迭代器=_gnu_cxx::_normal_迭代器;_谓词=布尔(*)(std::vector,
std::vector)]':
/usr/include/c++/4.8/bits/stl_-algo.h:4465:41:从''u IIter'中需要
std::find_if(_IIter,_IIter,_谓词)[带_IIter=
__gnu_cxx::uuu normal_迭代器;_Predicate=bool(*)(std::vector,std::vector)]'
/usr/include/c++/4.8/bits/stl_-algo.h:1144:64:必须来自'\u-FIter'
std::remove_if(_FIter,_FIter,_Predicate)[with _FIter=
__gnu_cxx::uuu normal_迭代器;_Predicate=bool(*)(std::vector,std::vector)]'
解决方案。cpp:40:64:从此处开始需要
/usr/include/c++/4.8/bits/stl_algo.h:214:23:错误:参数太少,无法
功能
如果(uuu pred(*uuuu first))
^
/usr/include/c++/4.8/bits/stl_algo.h:218:23:错误:参数太少,无法
功能
如果(uuu pred(*uuuu first))
^
/usr/include/c++/4.8/bits/stl_algo.h:222:23:错误:参数太少,无法
功能
如果(uuu pred(*uuuu first))
^
有人能帮我调试一下吗? 提前谢谢

编辑

向量的元素被排序,所有这些向量也被排序

Unique也会给出一个错误。我不明白为什么

为什么我提供的链接中给出的示例在这里没有帮助?

好的,因为它没有用C++11标记,所以我将使用函子而不是lambda

第一个问题是接受一元谓词,这意味着它应该只接受一个参数

第二个问题还与您对
remove\u if
的理解有关。将
compareVec
修改为只接受一个参数后,您会想知道如何能够将所有元素相互比较

您可以采用以下两种方法之一:

  • 对向量进行排序(
    好的,因为这不是用C++11标记的,所以我将使用函子而不是lambda

    第一个问题是接受一元谓词,这意味着它应该只接受一个参数

    第二个问题还与您对
    remove\u if
    的理解有关。在您将
    compareVec
    修改为只接受一个参数后,您会想知道如何可能将所有元素相互比较

    您可以采用以下两种方法之一:


    • 对向量向量进行排序(
      std::remove_,如果
      需要一个一元谓词。您传递一个二元谓词,这会导致错误(
      /usr/include/c++/4.8/bits/stl_algo.h:222:23:错误:参数太少,无法运行
      → 函数接受两个参数,而不是一个)。 此外,
      std::remove\u如果
      在删除时不考虑其他元素(这就是它接受一元谓词的原因),那么它实际上不是您想要的

      您想要使用的是
      std::unique
      ,它确实需要您已经实现的
      compareVec
      。但是,
      std::vector
      已经提供了
      操作符==
      重载,因此实现实际上是冗余的!而且,您说在使用
      std::unique
      时出现错误。请尝试传递您的p参数为
      常数&


      因此,当外部向量和内部向量已排序时,解决方案与已排序元素的任何其他向量相同:

      outer.erase(std::unique(outer.begin(), outer.end()), outer.end());
      

      std::remove_if
      需要一个一元谓词。您传递了一个二进制谓词,这会导致错误(
      /usr/include/c++/4.8/bits/stl_algo.h:222:23:错误:函数的参数太少
      → 函数接受两个参数,而不是一个)。 此外,
      std::remove\u如果
      在删除时不考虑其他元素(这就是它接受一元谓词的原因),那么它实际上不是您想要的

      您想要使用的是
      std::unique
      ,它确实需要您已经实现的
      compareVec
      。但是,
      std::vector
      已经提供了
      操作符==
      重载,因此实现实际上是冗余的!而且,您说在使用
      std::unique
      时出现错误。请尝试传递您的p参数为
      常数&


      因此,当外部向量和内部向量已排序时,解决方案与已排序元素的任何其他向量相同:

      outer.erase(std::unique(outer.begin(), outer.end()), outer.end());
      

      您的
      compareVec
      当前正在创建两个向量的副本,以便在每次调用时进行比较。cringe。改为通过常量引用获取它们。此外,如果
      传递给
      remove\u的可调用项只应获取一个参数。您可以使用捕获的lambda实现所需的功能。此外,这不是正确移除重复项的方法y、 您正在编译C++11或更高版本吗?查看我的更新答案两个答案都很有用,但第一个答案更容易理解,因此请将其标记为正确的答案。+1对于AndyG的答案您的
      compareVC
      当前正在制作两个向量的副本,以便在每次调用时进行比较。畏缩。取而代之的是常量引用。另外,调用如果
      只需要一个参数,就可以传递到
      remove\u。使用捕获的lambda可以实现所需的功能。此外,这不是正确删除重复项的方法。是否编译C++11或更高版本?请参阅我的更新答案这两个答案都很有用,但第一个答案更容易理解,因此
      
      for (size_t i = 0; i < ans.size(); ++i)
      {
          ans.erase(std::remove_if(ans.begin()+i+1, ans.end(), 
          [&ans, &i](const std::vector<int>& _rhs)
          { 
              return ans[i] == _rhs;
          }) , ans.end());
      }
      
      outer.erase(std::unique(outer.begin(), outer.end()), outer.end());