多維vector去重

對於二維數組,比如 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的泛型編程還是蠻強的。

(完)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章