我知道unique和erase可以用来去重,如果vector的元素是int类型的,这个我是会的;
现在碰到了一个问题,就是vector的元素还是vector,但是vector的vector的元素是int类型
如下
[[1,2,3,4],[2,3,1,4],[4,5,6,7]]
请问要通过什么操作才能实现去重?定义这里的去重指的是把组成元素相同的vector给去掉,比如这里的
前两个vector就属于相同的vector
你要把里面的元素取出来,再建一个新的vector,把元素放进去
如下是去重的简单例子,参考一下
/*********************************************************************************
Copyright(C),Your Company
Description:c++ vector 元素去重
unique的使用
Others:
**********************************************************************************/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> vec{ 3,4,5,1,2,5,3 };
sort(vec.begin(), vec.end());
// pos是去重以后vector中没有重复元素的下一个位置的迭代器。
auto pos = unique(vec.begin(), vec.end());
//去重后整个容器
for(auto v : vec)
cout << v << ' ';
cout << endl; // 1 2 3 4 5 5 5
for(auto iter = vec.begin(); iter < pos; iter++)
cout << *iter << ' ';
cout << endl; // 1 2 3 4 5
vec.erase(pos, vec.end()); // erase()擦除无意义的部分
return 0;
}
自定义比较运算为将vector转为set后比较
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
struct {
int operator()(vector<int> a, vector<int> b)
{
sort(a.begin(), a.end());
sort(b.begin(), b.end());
set<int> sta(a.begin(), a.end());
set<int> stb(b.begin(), b.end());
int r=0;
for (auto ita = sta.begin(),
itb = stb.begin();
ita != sta.end(),
itb != stb.end();
++ita,
++itb) {
r = (*ita - *itb);
if (r) break;
}
return r;
}
} vector_int_compare;
struct {
bool operator()(vector<int> a, vector<int> b)
{
sort(a.begin(), a.end());
sort(b.begin(), b.end());
set<int> sta(a.begin(), a.end());
set<int> stb(b.begin(), b.end());
int r=0;
for (auto ita = sta.begin(),
itb = stb.begin();
ita != sta.end(),
itb != stb.end();
++ita,
++itb) {
r = (*ita - *itb);
if (r) break;
}
return r==0;
}
} vector_int_equal;
int main()
{
vector<vector<int> > v {{1,2,3,4},{2,3,1,4},{4,5,6,7}};
sort(v.begin(), v.end(), vector_int_compare);
auto last = unique(v.begin(), v.end(), vector_int_equal);
v.erase(last, v.end());
sort(v.begin(), v.end(), vector_int_compare);
for (vector<int> vi : v) {
for (int i : vi) {
cout << i << " ";
}
cout << endl;
}
cout << endl;
return 0;
}
//1 2 3 4
//4 5 6 7
//
穷举呗,先把数组0去重,在拿数组0中元素给之后的数组去重,再给数组1去重,在拿数组1给以后的数组去重,重复