您的位置:首页 > 其它

STL学习笔记(十二) 关联式容器共性

2013-05-21 21:24 274 查看

关联式容器共性:

1 关联式容器包括:

set multiset map multimap

2 关联式容器共性:

关联式容器l除了可以使用标准容器共性外 还拥有以下关联容器共性:

实质都是红黑树,都自动根据key排序

set<K> multiset<K> map<K,V> multimap<K,V>

查找: .find(key) 返回一个迭代器,指向找到的第一个元素 失败返回.end()

查找速度非常快 lgN

统计: .count(key) 统计 关键字等于key的元素 的个数

删除: .erase(key) 删除 关键字等于key的 所有元素

区间: .lower_bound(key) 取得关键字为key的第一个元素位置

.upper_bound(key)取得关键字为key的最后一个元素之后的位置

.equal_range(key) 一次取得关键字为key的元素的区间 返回一个pair

插入: insert(element) // 不需要写位置,容器自动放在该放的位置

构造函数可以用比较函数作为参数,默认是使用小于

bool (*compare)(K a,K b) { }

必须对key支持小于运算符,否则没法插入

3 关联容器示例:

#include <iostream>
#include <set> //头文件也是set
using namespace std;
#include "show.h"
struct Person
{
string name; //公有
int age;
public:
Person(const char *name,int a):name(name),age(a){}

};

//在关联式容器中  容器内容一定要能支持 < 符号
bool operator<(const Person &a, const Person &b)
{
return a.age<b.age || (a.age==b.age && a.name < b.name);
}

ostream& operator<<(ostream& o,const Person &p)
{
return o << p.name << ':' << p.age;
}

int main()
{
multiset<Person>  mp;
mp.insert(Person("cj",23));
mp.insert(Person("zyh",24));
mp.insert(Person("jack",25));
mp.insert(Person("kk",22));
mp.insert(Person("lll",26));
mp.insert(Person("jack",25));
mp.insert(Person("lll",26));
mp.insert(Person("lll",26));
mp.insert(Person("jack",25));
mp.insert(Person("lll",26));
show(mp.begin(),mp.end());

//查找

//迭代器一定要带类型
multiset<Person>::iterator it =  mp.find(Person("zyh",24));
//find  比较相等时与 < 比较的内容相关
//比如之前我在operator < 中只比较了年龄,find中找到的是年龄相同的
if( it == mp.end() )
{
cout << "没有找到zyh" << endl;
}
else
{
cout  <<  "发现目标" << *it << endl;
}

// 统计个数
it = mp.find(Person("jack",25));
cout << mp.count(*it) <<  "个" << *it <<endl; //3

it = mp.find(Person("lll",26));
cout << mp.count(*it) << "个" << *it <<endl;//4

//范围 上下界
multiset<Person>::iterator ib,ie;
ib = mp.lower_bound(Person("jack",25));
ie = mp.upper_bound(Person("jack",25));

cout << "===================" << endl;
show(ib,ie); //输出 jack:25 jack:25 jack:25  主要是因为树自动将值进行了排序,相同的都放在一起

typedef multiset<Person>::iterator Iter;
pair< Iter,Iter> q = mp.equal_range(Person("lll",26)); //pair不用头文件
show(q.first,q.second); //lll:26 lll:26 lll:26 lll:26

cout << "======================" << endl;
mp.erase(Person("jack",25)); //删除
show(mp.begin() , mp.end() );

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: