C++ set容器、pair对组、map容器学习

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、set、multiset容器学习

set容器只有键值,没有实值(键值实值同一个值),不允许有相同的键值;在插入数据的时候自动根据键值排序;不能修改set容器元素的值,会破坏set的数据结构。set容器的迭代器是只读迭代器const_iterator.
multiset和set用法完全相同,区别在于允许键值重复。两者的底层实现是红黑树。

二、插入数据

代码如下(示例):

class MyCompare
{
public:
	bool operator()(int v1,int v2)
	{
		return v1>v2;
	}
};

void test01()
{
	set<int> s1;
	//插入数据
	s1.insert(30);
	s1.insert(10);	
	s1.insert(50);	
	s1.insert(40);
	s1.insert(20);
	printSetInt(s1);   //10 20 30 40 50
	//更改排序规则:定义set时修改 set<int,排序规则类> s2;
	set<int,MyCompare> s2;  //从大到小
	printSetInt(s2);  //50 40 30 20 10
}

若set存放自定义数据,必须更改排序规则

代码如下(示例):

//自定义类
class Person
{
	friend class MyComparePerson();//类做友元
	friend ostream& operator<<(ostream &out,Person ob);//重载输出运算符  友元
private:
	int num;
	string name;
	float score;
public:
	Person(){}
	Person(int num,string name,float score)
	{
		this->num = num;
		this->name = name;
		this->score = score;
	}
};
//重载输出运算符
ostream& operator<<(ostream &out,Person ob)
{
	out<<ob.num<<" "<<ob.name<<" "<<ob.score<<endl;
	return out;
}

//定义规则类
class MyComparePerson()
{
public:
	bool operator()(Person ob1,Person ob2)
	{
		return ob1.num<ob2.num;
	}
}
//打印输出
void printSet(set<Person,MyCompare> &s)
{
	set<Person,MyCompare>::iterator it;
	for(it = s.begin();it!=s.end();it++)
	{
		cout<<(*it)<<" ";
	}
	cout<<endl;
}

void test01()
{
	set<Person,MyComparePerson> s1;
	//set存放Person类数据
	s1.insert(Person(100,"aaa",88.6));
	s1.insert(Person(102,"bbb",99.8));
	s1.insert(Person(101,"ccc",77.7));
	printSet(s1);  //从小到大
}

二、查找数据

find() 查找键值是否存在,存在返回该键的元素的迭代器,不存在返回set.end()。
count(); 查找set容器中键的元素的个数,在set中结果只能是: 0 或1

	set<int> s2;
	s2.insert(10);
	s2.insert(30);
	s2.insert(50);
	s2.insert(70);
	set<int>::const_iterator ret;
	ret = s1.find(50);
	if(ret !=s1.end())
	{
		cout<<"找到结果:"<<*ret<<endl;   //50
	}
	cout<<s1.count(50)<<endl;  //1

查找元素上下限:
lower_bound(keyElem) 返回第一个key >=keyElem元素的迭代器 (下限)
upper_bound(keyElem) 返回第一个key >keyElem元素的迭代器 (上限)
若keyElem在set容器中存在,上下限不相等;不存在,上下限相等

	set<int> s2;
	s2.insert(10);
	s2.insert(30);
	s2.insert(50);
	s2.insert(70);
	set<int>::const_iterator ret;
	ret = s1.lower_bound(50);
	if(ret !=s1.end())
	{
		cout<<"下限为:"<<*ret<<endl;             //50
	}
	ret = s1.upper_bound(50);
	if(ret !=s1.end())
	{
		cout<<"上限为:"<<*ret<<endl;    //70
	}

equal_range(keyElem) 返回容器中key与keyElem相等的上下限的两个迭代器。其返回值用 pair 对组接收

	set<int> s2;
	s2.insert(10);
	s2.insert(30);
	s2.insert(50);
	s2.insert(70);
	pair<set<int>::const_iterator, set<int>::const_iterator> p;
	p = s1.equal_range(50);
	if(p.first !=s1.end())
	{
		cout<<"下限为:"<<*(p.first)<<endl;
	}
	if(p.second !=s1.end())
	{
		cout<<"下限为:"<<*(p.second)<<endl;
	}

multiset
count(); 查找multiset容器中键的元素的个数,结果就是实际的个数

三、pair对组学习

	//创建对组一
	pair<int,string> p1(1,"pingguo");
	pair<int,string> p2(2,"juzi");
	pair<int,string> p3(3,"li");	
	
	//创建对组二
	pair<int,string> p4 = make_pair(111,"aaa");
	
	//访问
	cout<< p4.first<<" "<<p4.second<<endl;

四、map容器学习

map容器每个元素由键值、实值成对存储、自动根据键值排序,键值不能重复,按照键值进行排序,不允许修改键值;multimap允许键值重复。

class Person
{
	friend void printMapAll(map<int,Person> &m);
private:
	int num;
	string name;
	float score;
public:
	Person(){}
	Person(int num,string name,float score);
};
Person::Person(int num,string name,float score)
{
	this->name = name;
	this->num = num;
	this->score = score;
}

void printMapAll(map<int,Person> &m)
{
	map<int,Person>::const_iterator it;
	for(it = m.begin();it!=m.end();it++)
	{
		cout<<(*it).second.name<<" ";
	}
	cout<<endl;
}

void test()
{
	map<int,Person> m;
	//插入数据
	m.insert(pair<int,Person> (103,Person(103,"lucy",88,8)));
	
	m.insert(make_pair(101,Person(101,"bob",77,8)));
	
	m.insert(map<int,Person>::value_type( 102, Person(101,"tom",66,8 ) )  );
	
	m[104] = Person(104,"kangkang",99,8);
	printMapAll(m);
	
	//假如key值存在,m[key]代表对应的实值
	//key值不存在,会在内部新增
	
	//删除
	m.erase(104);
	//查找key
	map<int,Person>::const_iterator ret;
	ret = m.find(103);  //返回迭代器
	if(ret !=m.end())
	{
		//*ret == pair<int,Person>
		cout<<(*ret).first<<" ";
	}
	
}

遍历:用迭代器遍历输出即可。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值