C++容器之Set

简介

         一个集合(set)是一个容器,它其中所包含的元素的值是唯一的。这在收集一个数据的具体值的时候是有用的。集合中的元素按一定的顺序排列,并被作为集合中的实例。一个集合通过一个链表来组织,在插入操作和删除操作上比向量(vector)快,但查找或添加末尾的元素时会有些慢。具体实现采用了红黑树的平衡二叉树的数据结构。

成员函数


复制控制


set::set()

         构造函数:创建一个set容器对象,并初始化其内容。

set::~set()

         析构函数:销毁一个set容器对象。

set::operator=

         为容器分配新的内容以代替其当前内容。

示例代码

#include <iostream>
#include <set>

using namespace std;

bool fncmp(int m, int n)
{
	return m < n;
}

class classcmp{
public:
	bool operator() (const int& m, int& n) const
	{
		return m < n;
	}
};

int main(void)
{
	int arr[] = {1, 2, 3, 4, 5};
	
	// set::set()
	set<int> first;
	set<int> second(arr, arr+5);
	set<int> third(second);
	set<int> fourth(third.begin(), third.end());
	bool (*fun)(int, int) = fncmp;
	set<int, bool (*)(int, int)> fifth(fun);
	set<int, classcmp> sixth;
	
	// set::operator=
	first = second;
	
	return 0;	
}

Iterators


set::begin()

         返回指向set容器第一个元素的迭代器,其类型为iterator/const_iterator。

set::end()

         返回指向set容器最后一个元素下一个位置的迭代器,其类型为iterator/const_iterator。

set::rbegin()

         返回指向set容器最后一个元素的反向迭代器,其类型为iterator/const_iterator。

set::rend()

         返回指向set容器第一个元素前一个位置的反向迭代器,其类型为iterator/const_iterator。

set::cbegin()

         begin()的const版本,返回值类型为const_iterator。

set::cend()

         end()的const版本,返回值类型为const_iterator。

set::crbegin()

         rbegin()的const版本,返回值类型为const_iterator。

set::crend()

         rend()的const版本,返回值类型为const_iterator。

示例程序

<span style="font-size:18px;">#include <iostream>
#include <set>

using namespace std;

int main(void)
{
	int arr[] = {1, 2, 3, 4, 5};
	set<int> first(arr, arr+5);
	
	// set::begin() end()
	for(set<int>::iterator it=first.begin();
		it!=first.end(); ++it){
		cout << *it << " ";
	}
	cout << endl;
	
	// set::rbegin() rend()
	for(set<int>::reverse_iterator it=first.rbegin();
		it!=first.rend(); ++it){
		cout << *it << " ";
	}
	cout << endl;
	
	// set::cbegin() cend()
	for(set<int>::const_iterator it=first.cbegin();
		it!=first.cend(); ++it){
		cout << *it << " ";
	}
	cout << endl;
	
	// set::crbegin() crend()
	for(set<int>::const_reverse_iterator it=first.crbegin();
		it!=first.crend(); ++it){
		cout << *it << " ";
	}
	cout << endl;
	
	return 0;
}</span><span style="font-size:24px;">
</span>

Capacity


set::empty()

         判断set容器是否为空,如果为空返回true,否则返回false。

set::size()

         返回容器中的元素的个数。

set::max_size()

         返回set容器能存储元素的最大数量。

示例程序

<span style="font-size:18px;">#include <iostream>
#include <set>

using namespace std;

int main(void)
{
	int arr[] = {1, 2, 3, 4, 5};
	set<int> first(arr, arr+5);
	
	// set::empty()
	if(!first.empty()){
		cout << "First is empty." << endl;
	}else{
		cout << "First is not empty." << endl;
	}
	
	// set::size()
	cout << "The size of first is " << first.size() << endl;
	
	// set::max_size()
	cout << "The max size of set can hold is " << first.max_size();
	cout << endl;
	
	return 0;
}</span><span style="font-size:24px;">
</span>

Modifiers


set:insert()

         向容器中插入一个或一组元素。

set::erase()

         根据迭代器或值删除容器中的一个或一组元素。

set::swap()

         交换两个容器总的元素。

set::clear()

         删除容器中的所有元素。

set::emplace()

         向容器中插入一个元素,插入的元素由其构造函数构造。

set::emplace_hint()

         根据迭代器指定的位置插入一个元素,插入的元素由其构造函数构造。

示例程序

#include <iostream>
#include <set>

using namespace std;

void print(set<int> s)
{
	for(set<int>::iterator it=s.begin();
		it!=s.end(); ++it){
		cout << *it << " ";
	}
	cout << endl;
}

int main(void)
{	
	set<int> first;
	
	// set::insert()
	first.insert(10);
	set<int>::iterator it = first.begin();
	pair<set<int>::iterator, bool> ret;
	ret = first.insert(10);
	if(ret.second == false){
		it = ret.first;
	}
	first.insert(it, 30);
	first.insert(it, 20);
	int arr[] = {40, 50};
	first.insert(arr, arr+2);
	print(first);
	
	// set::erase()
	it = first.begin();
	first.erase(++it);
	first.erase(40);
	it = first.find(50);
	first.erase(it, first.end());
	print(first);
	
	//set::swap()
	set<int> second(arr, arr+2);
	first.swap(second);
	print(first);
	print(second);
	
	// set::clear()
	second.clear();
	
	// set::emplace()
	first.emplace(30);
	ret = first.emplace(30);
	if(ret.second == false){
		cout << "30 is already existed." << endl;
	}
	print(first);
	
	// set::emplace_hint
	first.emplace_hint(first.end(), 60);
	print(first);
	
	
	
	return 0;
}

Observers


set::key_comp()

         返回一个key_compare对象,该对象确定了元素在容器中的顺序。它是一个有两个参数的函数指针或函数对象。它参数的类型和set中元素的类型一致,如果第一个参数的值和第二个参数的值满足其默认存储顺序则返回true,否则返回false。

set::value_comp()

         在set中,key_comp()和value_comp()是等价的。

示例程序
#include <iostream>
#include <set>

using namespace std;

int main(void)
{
	int arr[] = {1, 2, 3, 4, 5};
	set<int> first(arr, arr+5);
	
	// set::key_comp()
	set<int>::key_compare comp;
	comp = first.key_comp();
	int highest = *first.rbegin();
	set<int>::iterator it = first.begin();
	do{
		cout << *it << " ";
	}while(comp(*it++, highest));
	cout << endl;
	
	// set::value_comp()
	set<int>::value_compare vcomp;
	vcomp = first.value_comp();
	it = first.begin();
	do{
		cout << *it << " ";
	}while(comp(*it++, highest));
	cout << endl;
	
	return 0;
}

Operators


set::find()

         在容器中查找元素,找到返回指向该元素的迭代器,否则返回指向容器最后一个元素的下一个位置的迭代器。

set::count()

         计算指定值的元素在容器中的个数,因为set中元素是唯一的,所以其返回值一定为1。

set::lower_bound()

         返回指向大于或等于某个值的第一个元素的迭代器

set::upper_bound()

         返回指向大于给定值的第一个元素的迭代器。

set::equal_range()

       返回集合中与给定值相等的上下限的两个迭代器

示例代码

#include <iostream>
#include <set>

using namespace std;

void print(set<int> s)
{
	for(set<int>::iterator it=s.begin();
		it!=s.end(); ++it){
		cout << *it << " ";
	}
	cout << endl;
}

int main(void)
{
	int arr[] = {1, 2, 3, 4, 5};
	set<int> first(arr, arr+5);

	// set::find()
	auto it = first.find(3);
	if(it != first.end()){
		cout << "Found it." << endl;
	}else{
		cout << "Not found." << endl;
	}
	
	// set::count()
	cout << "The number is " << first.count(2) << endl;
	
	// set::lower_bound() upper_bound()
	set<int>::iterator lowit, upit;
	lowit = first.lower_bound(3);
	upit = first.upper_bound(4);
	first.erase(lowit, upit);
	print(first);
	
	// set::equal_range()
	pair<set<int>::iterator, set<int>::iterator> ret;
	ret = first.equal_range(2);
	cout << "The lower bound point " << *ret.first << endl;
	cout << "The upper bound point " << *ret.second << endl;
	
	return 0;
}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值