C++ Set

原文

原有文章

set本身接口

初始化

声明一个空的数组

	std::set<int> Set1;                         

声明一个set,初始化数据未数组的前四个数据,并且会将该4个数据进行排序,默认从大到小

	int myints[] = { 10, 20, 50, 30, 40 };
	std::set<int> Set2(myints, myints + 5);       

以其他set数据进行初始化

	std::set<int> Set3(Set2);                           

以其他数据进行初始化,初始化的数据为set2的初始位置到end前一位,并且不包含该位置

	std::set<int> Set4(Set2.begin(), --Set2.end());

自定义排序方式,从大到小排序

struct SetCompare {
	bool operator() (const int& lhs, const int& rhs) const
	{
		return lhs > rhs;
	}
};
	int myints[] = { 10, 20, 50, 30, 40 };
	std::set<int, SetCompare> Set5(myints, myints + 5);                 

自定义函数指针排序方式,在添加数据时会按照Compare进行比较再次排序

static bool Compare(int lhs, int rhs) { return lhs<rhs; }
	bool(*fn_pt)(int, int) = Compare;
	std::set<int, bool(*)(int, int)> Set6(fn_pt);  // function pointer as Compare

添加元素

添加一个元素,需要注意的是,如果set中原本存在这个元素,则不会添加成功

 Set6.insert(10);

ret中的值为两个,当set1中存在5时,返回的bool值为false。迭代器指向这个元素,如果原有set1中不存在5,则会在set中加入5,并且bool值为true,迭代器为指向这个新元素的迭代器

	std::pair<std::set<int>::iterator, bool> ret = Set1.emplace(5);

该方法需要额外传入一个迭代器,用来指明新元素添加到 set 容器的具体位置(新元素会添加到该迭代器指向元素的前面);
返回值是一个迭代器,而不再是 pair 对象。当成功添加元素时,返回的迭代器指向新添加的元素;反之,如果添加失败,则迭代器就指向 set 容器和要添加元素的值相同的元素。同时,set会重新排序;

std::set<int>::iterator ret = Set1.emplace_hint(Set1.begin(),12);

删除元素

删除元素为5的值

Set1.erase(5);

从it位置开始一直删除到++(++it1)处,但不包含++(++it1)

	auto it = Set1.find(5);
	auto it1 = it;
	Set1.erase(it, ++(++it1));

删除it

	auto it = Set1.find(5);
	Set1.erase(it);

全部清空

Set1.clear();

元素个数

Set1.size()

是否为空

如果为空返回true,不为空返回false

Set1.empty()

是否含有某个值

如果存在返回1,不存在返回0

myset.count(i)

遍历

for (auto it = Set1.begin(); it != Set1.end(); it++)
{
	std::cout << *it << std::endl;
}

检查某个值是否存在

返回这个值的迭代器,如果该迭代器指向end则表明数组中不存在该元素,否则迭代器指向该元素

it = myset.find(60);

获取与给定值相关的迭代器

返回与给定值9相关的两个迭代器,第一个迭代器为等于9的迭代器的值,第二个值为第一个大于9的迭代器的值;那个不存在则会返回end

std::pair<std::set<int>::const_iterator, std::set<int>::const_iterator> ret;
	ret = Set1.equal_range(9);

获取第一个小于等于5的迭代器的位置

	auto itlow = Set1.lower_bound(5);                //       ^

获取第一个大于5的迭代器的位置

	auto itup = Set1.upper_bound(5);     

交换两个set

	first.swap(second);

反向迭代器

指向最后一个元素的迭代器,执行++与–均与begin相反

Set1.rbegin()

指向第一个数组的反向迭代器,功能与正想的end()类似

Set1.rend()

使用

for (std::set<int>::reverse_iterator rit = Set1.rbegin(); 
rit != Set1.rend(); ++rit)

自定义结构体排序

自定义结构体定义

class MyClass
{
public:
	int i;
};

采用函数指针判断

static bool Compare(MyClass lhs, MyClass rhs) { return lhs.i >rhs.i; }
	std::set<MyClass,bool(*)(MyClass,MyClass)> Set1(Compare);      

采用仿函数进行比较 判断

struct SetCompare {
	bool operator() (const MyClass& lhs, const MyClass& rhs) const
	{
		return lhs.i > rhs.i;
	}
};
	std::set<MyClass, SetCompare> Set1;       

重写<运算符

class MyClass
{
public:
	bool operator< ( const MyClass& rhs) const
	{
		return this->i < rhs.i;
	}
public:
	int i;
};
std::set<MyClass> Set1;    
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值