集合set/multiset容器部分API总结

版权声明:本博客为博主原创文章,未经博主允许,禁止转载,谢谢合作。 https://blog.csdn.net/weixin_43971252/article/details/88574231

1.set容器是一种关联式容器,在插入数据时会根据键值进行排序,不允许出现重复的键值。
2.set容器不能通过迭代器来修改键值,其迭代器不支持随机访问.
3.multiset允许键值重复

#include<iostream>
#include<set>       //set 或 multiset
#include<string>
using namespace std;

//关联式容器:在插入数据时会按照键值大小顺序对元素进行排序,排序后的序列为最终的容器元素系列
//集合set特性:1.所有元素都会根据元素的键值自动被排序,set容器不允许出现的键值.
//2.set容器不可以通过迭代器来改变元素的值,因为如果改变了值,那么就不一定是有序的系列,破坏了set容器的组织,也就是说set的迭代器是一种const_iterator
//3.set的迭代器不支持随机访问,set的键值(key)就是实值(value)
//multiset和set的区别在于multiset允许键值重复


void printSet(set<int>& s) {
	
	if (s.empty())
	{
		cout << "set is empty" << endl;
		return;
	}
	cout << "set elem: ";
	for (set<int>::iterator it = s.begin(); it != s.end(); it++)
		cout << *it << " ";
	cout << endl;
}
//初始化和赋值
void test_one() {

	set<int> s1;
	
	s1.insert(2);         //插入元素
	s1.insert(-6);
	s1.insert(0);
	s1.insert(99);
	s1.insert(-100);

	printSet(s1);         //-100 -6 0 2 99

	set<int> s2(s1);      //拷贝构造函数
	set<int> s3 = s1;    //重载 =

	s1.swap(s2);         //交换两个set容器

	if (s1.empty())
		cout << "set is empty" << endl;
	else
		cout << "set size : " << s1.size() << endl;
}

//插入和删除
void test_two() {

	set<int> s1;

	//插入元素
	s1.insert(-100);
	s1.insert(2);        
	s1.insert(-6);
	s1.insert(0);
	s1.insert(99);
	s1.insert(-100);      //set容器中重复的键值不会再插入
	printSet(s1);
	
	//删除元素
	s1.erase(-100);         //1.(elem) 删除set容器里值为-100的元素
	printSet(s1);
	s1.erase(s1.begin());   //2.(pos) 删除指定的迭代器位置的元素
	printSet(s1);
	s1.erase(s1.begin(), s1.end());  //3.(start,end) :删除区间[start,end)的所有数据
	printSet(s1);
}

//查找
void test_three() {

	set<int> s;

	s.insert(10);
	s.insert(7);
	s.insert(5);
	s.insert(3);
	s.insert(0);
	printSet(s);

	//find(key)查找元素,查找成功返回该元素对应的迭代器,查找失败返回set.end()
	set<int>::iterator pos = s.find(3);
	if (pos != s.end())
		cout << "find succeed, value = " << *pos << endl;
	else cout << "no find" << endl;

	//count(key)查找key在集合中的个数,在set容器里返回值只有1和0,因为set不会出现重复的元素
	int num  (s.count(7));
	cout << "7 count : " << num << endl;
	num = s.count(-1);
	cout << "-1 count : " << num << endl;

	//lower_bound(elem)查找容器里第一个大于等于给定值elem的元素,成功则返回第一个元素的迭代器,失败返回set.end()
	set<int>::iterator lower(s.lower_bound(7));
	if (lower != s.end())
		cout << "找到容器里第一个大于等于 7 的元素,该元素为: " << *lower << endl;
	else  cout << "no find" << endl;

	//upper_bound(elem) 查找第一个大于elem的元素
	set<int>::iterator upper = s.upper_bound(7);
	if(upper!=s.end())
		cout << "找到容器里第一个大于 7 的元素,该元素为: " << *upper << endl;
	else  cout << "no find" << endl;

	//equal_range(elem)能同时实现lower_bound()和upper_bound(),返回值为集合中与给定值elem相等的上下限(a<=elem<b),用对组来接收上下限
	pair<set<int>::iterator,set<int>::iterator> range = s.equal_range(7);
	if (range.first != s.end())
		cout << "找到下限为: " << *range.first << endl;
	else cout << "no find" << endl;
	if (range.second != s.end())
		cout << "找到上限为: " << *range.second << endl;
	else cout << "no find" << endl;
}
/*-------------------------------------------------------------------------------*/

//对组pair:对组中的两个元素的数据类型可以一样,也可以不一样
void test_pair() {

	pair<string, int> p1((string)"prim", 23);         //1,使用拷贝构造方式创建
	
	cout << "name : " << p1.first << "   ";           //获取对组中的第一个元素
	cout << "age : " << p1.second << endl;            //获取对组中的第二个元素

	pair<string, int> p2 = make_pair("binary", 22);  //2.使用make_pair方式创建对组

	cout << "name : " << p2.first << "   ";
	cout << "age : " << p2.second << endl;

	p2.swap(p1);                                     //交换两个拥有相同数据类型的对组
	cout << "name : " << p2.first << "   ";
	cout << "age : " << p2.second << endl;

	pair<string, int> p3 = p1;                       //3.重载 =
	cout << "name : " << p3.first << "   ";
	cout << "age : " << p3.second << endl;
}
/*-----------------------------------------------------------------------------------*/

//测试set.insert,判断集合set能不能出现重复键值
//插入函数的返回值是对组数据类型,pair<iterator,bool>, 对组的第一个元素为一个迭代器,第二个元素为bool类型
void test_insert() {

	set<int> s;
	pair<set<int>::iterator, bool> res;

	res = s.insert(100);
	if (res.second)
		cout << "insert sucess" << endl;
	else
		cout << "insert fail" << endl;

	res = s.insert(100);
	if (res.second)
		cout << "insert sucess" << endl;
	else
		cout << "insert fail" << endl;
	printSet(s);
		
	/*
		insert sucess
		insert fail
		set elem : 100
	*/

	//multiset可以实现在集合中有重复元素
	multiset<double> s2;
	s2.insert(333.99);
	s2.insert(333.99);
	for (multiset<double>::iterator it = s2.begin(); it != s2.end(); it++)
		cout << *it << " ";
	cout << "\n";
	//333.99 333.99
}

//set排序:必须在插入数据前就进设置排序规则
//默认的规则是升序排序,如果要设置为降序排序,就要使用仿函数
//使用仿函数的方法:重载 ()
class myCompare
{
public :
	//重载 () 实现仿函数
	bool operator() (int a, int b) { 
		return a > b ? true : false;    //设置为降序排序
	}
};

void test_sort() {

	set<int, myCompare> s;     //第二个类型为拥有仿函数的类

	s.insert(1);
	s.insert(2);
	s.insert(3);
	s.insert(4);
	s.insert(5);
	for (set<int, myCompare>::iterator it = s.begin(); it != s.end(); it++) {
		cout << *it << "  ";
	}
	cout << "\n";
}

//集合与自定义数据类型
//自定义数据类似放入集合时,必须使用仿函数指定排序规则
class myclass
{
public:

	myclass(string name, int age) {
		this->m_age = age;
		this->m_name = name;
	}	

public:
	string m_name;
	int m_age;
};

class MyCompareClass
{
public :

	bool operator() ( myclass s1, myclass s2) {
		return s1.m_age > s2.m_age;                //指定排序规则为降序
	}
};

void test_four() {

	set<myclass, MyCompareClass> s;

	myclass p1("李白", 100);
	myclass p2("杜甫", 90);
	myclass p3("苏轼", 110);

	s.insert(p1);
	s.insert(p2);
	s.insert(p3);

	for (set<myclass>::iterator it = s.begin(); it != s.end(); it++)
		cout << "name: " << it->m_name << "  age: " << (*it).m_age << endl;
}

int main()
{
	//test_one();
	//test_two();
	//test_three();
	//test_pair();
	//test_insert();
	//test_sort();
	test_four();

	cin.get();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43971252/article/details/88574231
今日推荐