對於二維數組,比如 vector<vector<int>> 這樣的,如何去重呢?
和shell腳本很像。
shell腳本是 xxx | sort | uniq ;
C++代碼要記住3個關鍵詞: sort, unique, erase
1> 先sort,然後纔可能做unique;
2> unique完了之後,iterator指向最後一個元素之後,於是erase從此處至end()即可。
這裏比較神奇的是sort和unique可以直接比較2個一維 vector<int> 的大小。
具體代碼如下:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void print_vec2(vector<vector<int>>& vec)
{
for (auto v : vec) {
for (auto i : v) cout << i << " ";
cout << endl;
}
}
int main()
{
vector<vector<int>> vv = {
{1, 1, 2, 3},
{2, 1, 1, 3},
{1, 1, 2, 3},
{2, 1, 1, 3},
{3, 1, 1, 2},
{1, 2, 1, 3},
{3, 1, 1, 2},
{1, 2, 1, 3}
};
// Remove Redundancy
sort(vv.begin(), vv.end());
vv.erase(unique(vv.begin(), vv.end()), vv.end());
print_vec2(vv);
return 0;
}
輸出爲:
1 1 2 3
1 2 1 3
2 1 1 3
3 1 1 2
那麼,三重vector還能去重嗎?
能。不過本文的方法是去掉二維vector的重複,即 sort與unique還可以比較二重vector, 而二維vector內部的一維部分的重複卻不會被去掉。
(由此可見,sort與unique的cmp算子似乎是直接操作最直接元素的(對於三維vector而言就是操作二維vector;對於二維vector而言,就是操作一維vector),由此猜測該cmp算子做的就是內存的值大小比較。)
代碼如下:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void print_vec3(vector< vector< vector<int> > >& vvv)
{
cout << "{\n";
for (auto vv : vvv) {
for (auto v : vv) {
for (auto i : v) {
cout << i << " ";
}
cout << "\n";
}
cout << "---------\n";
}
cout << "}\n";
}
int main()
{
vector< vector< vector<int> > > vvv = {
{
{1, 1, 2, 3},
{2, 1, 1, 3},
{1, 1, 2, 3},
{2, 1, 1, 3}
},
{
{3, 1, 1, 2},
{1, 2, 1, 3},
{3, 1, 1, 2},
{1, 2, 1, 3}
},
{
{1, 1, 2, 3},
{2, 1, 1, 3},
{1, 1, 2, 3},
{2, 1, 1, 3}
}
};
print_vec3;
sort(vvv.begin(), vvv.end());
vvv.erase(unique(vvv.begin(), vvv.end()), vvv.end());
print_vec3(vvv);
return 0;
}
輸出爲:
{
1 1 2 3
2 1 1 3
1 1 2 3
2 1 1 3
---------
3 1 1 2
1 2 1 3
3 1 1 2
1 2 1 3
---------
}
總之,多重vector也可以做sort和unique有點意思。STL的泛型編程還是蠻強的。
(完)