1. 程式人生 > >vector 去重模板

vector 去重模板

C++中陣列/Vector中去除重複元素
unique函式是一個去重函式,去除相鄰中的重複元素(只留一個)。
其中,最關鍵的是:並不是刪除並不是把重複的元素刪除,而是全部放倒陣列的後面。
因為,unique只是去除(相鄰)的重複元素,因此,為了去除重複的元素,應該,首先對陣列/Vector進行排序,這樣保證重複元素在相鄰的位置。
unique函式,返回的是去重後的尾地址。
因此對於一個內容為{2, 2, 5, 5, 6}的vector,執行unique函式以後,vector大小並沒有改變,只不過順序變成了{2, 5, 6, 2, 5},並且函式的返回值為:3。

此時需要刪除重複元素,只需要將後面的資料全部刪除即可。

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <vector>
 4 using namespace std;
 5
 6
 7 int main() {
 8     vector<int> v;
 9     cout << "Number of vector's element : " << endl;
10     int number;
11     cin >> number;
12     for (int i = 0; i < number; i++) {
13         int temp;
14         cin >> temp;
15         v.push_back(temp);
16     }
17     sort(v.begin(),v.end());
18     v.erase(unique(v.begin(), v.end()), v.end());
19     for (int i = 0; i < v.size(); i++) {
20         cout << v[i] << " ";
21     }
22     cout << endl;
23     return 0;
24 }



題目:隨機輸入一組字元,對這組字元進行除重和排序輸出,
例如:輸入aafddbc
輸出:abcdf

程式:

#include "stdafx.h"
#include<iostream>
using namespace std;
void func1(char str[256], int len)
{
    int a[256] = { 0 };
    for (int i = 0; i<len; i++){
        if (a[str[i]] == 0)
        a[str[i]] = 1;
    }
    for (int i = 0; i < 256; i++)
    {
        if (a[i] == 1)
        putchar(i);
    }
    cout << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
    char str[256];
    cin >> str;
    int len = strlen(str);
    func1(str,len);
    return 0;
}


體會:此程式中可以利用int a[256]陣列來對輸入的字元陣列char str[256]進行除重和排序,字元和其ASCLL值可以自動轉換。
對str[256]中出現的字元,其字元對應的ASCLL值對應陣列a[]的下標i,所以可以對出現的字元對應的下標i,a[i]標記為1,
最後輸出a[i]=1的下標即是出現的字元ASCLL值,並且對a[i]下標順序輸出,再將 i 轉化為字元,即對出現的字元進行排序。這種方法很巧妙!!