在python里想去重,set()一下就好了。
c++里其实也有类似的办法。
结合这篇《C++ STL vector初始化》,基本能回溯python里面任意使用list+set的自由度。
一.直接使用构造函数
构造函数重载类型很多,我只推荐一个。
(_iter &left , _iter &right),左闭右开。
这个_iter类型很宽泛,可以是......
①数组地址
int a[] = {1,2,3,4,5};
set<int> s(a,a+5);
②迭代器
vector<int> v={1,2,3,4,5};
set<int> s(v.begin(),v.end());
二、使用insert
void insert(_Iter)(_Iter _First, _Iter _Last)
如果是预先声明好的set,可以采用insert。
使用方法基本同构造函数。
①数组地址
set<int> s;
int a[] = {1,2,3,4,5};
s.insert(a,a+5);
②迭代器
注意,跟顺序容器vector不同,set的insert不需要指定插入位置。
set<int> s;
vector<int> v={1,2,3,4,5};
s.insert(v.begin(),v.end()); //如果是vector的话,第一个参数会是插入位置。
当然了,直接使用initializer_list<>也是可以的。
set<int> sss = { 1,2,3,4,5 };
三、使用std::copy()
std::copy(_InIt _First, _InIt _Last, _OutIt _Dest)
copy又是一个更泛用的stl函数,需要指定插入位置(最后一个参数)。
#include <iterator>
set<int> s;
vector<int> v={1,2,3,4,5};
copy(v.begin(), v.end(), std::inserter(s,s.end()));
四、set交、并、补
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <set>
#include <vector>
#include <iterator>
set<int> test(const set<int> &a, const set<int> &b) {
set<int> c, d, e;
//并集
set_union(a.begin(), a.end(), b.begin(), b.end(), std::inserter(c,c.end()));
//交集
set_intersection(a.begin(), a.end(), b.begin(), b.end(), std::inserter(d,d.end()));
//差集
set_difference(a.begin(), a.end(), b.begin(), b.end(), std::inserter(e,e.end()));
return c;
};
总结一下,从需求出发
我有一串数据想去重。
①构造set
如果是从外部读入的,先存到数组a[]或者vector里
然后使用构造函数(a,a+n),或者insert(a,a+n),
或者构造函数(v.begin(),v.end()),或者insert(v.begin(),v.end())
②set还原到vector
//copy函数是memset级别的,不用担心效率问题
v.clear();
copy(s.begin(),s.end(),std::back_inserter(v));
③如果有多组数据,则分别用上述手法,初始化到集合a,b,c内。
然后对按需求abc求交并补。