提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、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<<" ";
}
}
遍历:用迭代器遍历输出即可。