vector 去重模板
阿新 • • 發佈:2019-01-23
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<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 轉化為字元,即對出現的字元進行排序。這種方法很巧妙!!
unique函式是一個去重函式,去除相鄰中的重複元素(只留一個)。
其中,最關鍵的是:並不是刪除並不是把重複的元素刪除,而是全部放倒陣列的後面。
因為,unique只是去除(相鄰)的重複元素,因此,為了去除重複的元素,應該,首先對陣列/Vector進行排序,這樣保證重複元素在相鄰的位置。
unique函式,返回的是去重後的尾地址。
因此對於一個內容為{2, 2, 5, 5, 6}的vector,執行unique函式以後,vector大小並沒有改變,只不過順序變成了{2, 5, 6, 2, 5},並且函式的返回值為:3。
此時需要刪除重複元素,只需要將後面的資料全部刪除即可。
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 轉化為字元,即對出現的字元進行排序。這種方法很巧妙!!