STL提供了四种联合容器 set,multiset,map,multimap;
set and multiset在<set>头文件
map and multimap在<map>头文件
模板函数都一样的http://www.cnblogs.com/jinmingyi/p/6798359.html
set/map中迭代器不能++或--,因为不是连续的序列,是树。
set:
在set中,值就是关键字,集合中不会有多个相同的关键字,且始终按从小到大的顺序排列
可反转可排序,关键字是唯一的,只能存储同一个类型的值
#include<iostream>
#include<set>
using namespace std;
void update(set<int>&s,set<int>::iterator it,int i)
{
int x = *it; //使x保存当前迭代器指向的数值
x += i; //x更改为需要的数值
s.erase(*it); //删除set中迭代器指向的数值*it
s.insert(x); //将新的x插入set
}
int main()
{
set<int>s; //声明一个set
for (int i = ; i < ; i++)
{
s.insert(i); //向set中插入数值
}
set<int>::iterator it;
int i;
if (s.find() == s.end())
cout << "no 2" << endl;
else
cout << "yes" << endl;
for (i=,it = s.begin(); it != s.end(); i++)
{
update(s,it, i); //不能对set中已有的数值操作 自己写个更新函数
it = s.find(i);
}
}
map:
map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的
声明一个map: map<下标的类型,对应数据的类型>name;
#include<map>
#include<iostream>
#include<string>
using namespace std;
int main()
{
map<string, int>mp; //声明一个map
mp["abc"] = ; //向map中添加一个数据
map<string, int>::iterator it;//声明一个迭代器
it = mp.find("aaa");//find函数返回一个迭代器,找到返回对应迭代器,否则返回end()
if (it == mp.end())
cout << "no" << endl;
}
还有这两个都可以用lowet_bound() (大于等于的第一个)和upper_bound() (绝对大于的第一个,双写p!) 返回的都是迭代器。
写博中发现一个细节:迭代器it对应的元素被删掉了,就不能在it++或it--;
如果