c++ 容器set

1set基本特点:

        set集合容器实现了红黑树(Red-BlackTree)的平衡二叉检索树的的数据结构,在插入元素时,它会自动调整二叉树的排列,把该元素放到适当的位置,以确保每个子树根节点的键值大于左子树所有节点的键值,而小于右子树所有节点的键值;另外,还得确保根节点的左子树的高度与有字数的高度相等,这样,二叉树的高度最小,从而检索速度最快。要注意的是,它不会重复插入相同键值的元素,而采取忽略处理。

        平衡二叉检索树的检索使用中序遍历算法,检索效率高于vectordeque、和list的容器。另外,采用中序遍历算法可将键值由小到大遍历出来,所以,可以理解为平衡二叉检索树在插入元素时,就会自动将元素按键值从小到大的顺序排列。

2、set基本操作:
#include
#include
#include

using namespace std;

//自定义比较函数,如果不定义,则默认从小到大排列
struct mycomp {
	bool operator()(const int &a, const int &b) {
		return a > b;
	}
};

//如果元素是结构体,可以直接把比较函数写在结构体中
struct Info {
	string name;
	int score;
	bool operator < (const Info &a) const {
		return a.score < score;
	}
};

int main()
{
	//set构造方法
	set s1;//方法一
	int d[] = { 1,4,4,3,6,8 };
	set s2(d, d + 5);//方法二
	set s3(s2.begin(), s2.end());//方法三

	//set插入方法
	s1.insert(1);
	s1.insert(5);
	s1.insert(7);
	s1.insert(3);
	s1.insert(5);//重复,不插入

	//set遍历
	set::iterator it = s2.begin();
	for (it; it != s2.end(); it++) {
		cout << *it;
	}
	cout << endl;

	//set反向遍历,reverse_iterator配合rbegin、rend
	set::reverse_iterator rit = s2.rbegin();
	for (rit; rit != s2.rend(); rit++) {
		cout << *rit;
	}
	cout << endl;

	//set删除
	it = s3.begin();
	for (int i = 0; i < 2; i++)
		it = s3.erase(it);
	for (it = s3.begin(); it != s3.end(); it++)
		cout << *it << " ";
	cout << endl;

	s3.clear();//清空数据
	cout << s3.size() << endl;

	//元素检索
	it = s2.find(5);
	if (it != s2.end()) {
		cout << "find elem 5" << endl;
	}
	else {
		cout << "not find elem 5" << endl;
	}
	//通过count方法判断
	if (s2.count(6)) {
		cout << "find elem 6" << endl;
	}
	else {
		cout << "not find elem 6" << endl;
	}

	//自定义比较函数
	int d2[] = { 2,8,3,9,1 };
	set s4;
	s4.insert(1);
	s4.insert(5);
	s4.insert(7);
	s4.insert(3);
	set::iterator it4 = s4.begin();
	for (it4; it4 != s4.end(); it4++) {
		cout << *it4;
	}
	cout << endl;

	//自定义结构体
	set s;
	Info info;
	info.name = "Jack";
	info.score = 80;
	s.insert(info);
	info.name = "Tom";
	info.score = 99;
	s.insert(info);
	info.name = "Steaven";
	info.score = 60;
	s.insert(info);

	set::iterator it5 = s.begin();
	for (it5; it5 != s.end(); it5++) {
		cout << (*it5).name << " : " << (*it5).score << endl;
	}

    return 0;
}

Set常用函数:跟其他容器的函数差不多

begin()--返回指向第一个元素的迭代器

clear()--清除所有元素

count()--返回某个值元素的个数

empty()--如果集合为空,返回true

end()--返回指向最后一个元素的迭代器

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

erase()--删除集合中的元素

find()--返回一个指向被查找到元素的迭代器

get_allocator()--返回集合的分配器

insert()--在集合中插入元素

:lower_bound()--返回指向大于(或等于)某值的第一个元素的迭

key_comp()--返回一个用于元素间值比较的函数

max_size()--返回集合能容纳的元素的最大限值

rbegin()--返回指向集合中最后一个元素的反向迭代器

rend()--返回指向集合中第一个元素的反向迭代器

size()--集合中元素的数目

swap()--交换两个集合变量

upper_bound()--返回大于某个值元素的迭代器

value_comp()--返回一个用于比较元素间的值的函数





你可能感兴趣的:(c++)