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
重载,因此实现实际上是冗余的!而且,您说在使用操作符==
时出现错误。请尝试传递您的p参数为std::unique
常数&
因此,当外部向量和内部向量已排序时,解决方案与已排序元素的任何其他向量相同: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
重载,因此实现实际上是冗余的!而且,您说在使用操作符==
时出现错误。请尝试传递您的p参数为std::unique
常数&
因此,当外部向量和内部向量已排序时,解决方案与已排序元素的任何其他向量相同:outer.erase(std::unique(outer.begin(), outer.end()), outer.end());
您的
当前正在创建两个向量的副本,以便在每次调用时进行比较。cringe。改为通过常量引用获取它们。此外,如果compareVec
传递给
只需要一个参数,就可以传递到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());
- 对向量向量进行排序(