C++ STL set快速初始化实现去重

在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求交并补。 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值