这两个容器控制的长度为N的序列是有N节点的红黑树存储的;集合中所有元素都是独一无二的,多重集合中允许存在副本。
模版类set multiset map multimap被称为关联容器,他们都把一个键值于一个元素对应起来,并用该键来查找,插入,删除等操作,他们对插入删除操作取得了比线型时间更好的对数时间效果,当元素增多时他们内部使用的是二分查找,效率更加高效;但如果我们不需要这种额外的效率,就可以避免那些导致好时间带来的可观的复杂度与额外的指针空间;
typedef set
构造函数
set() 生命一个空的按pred()排序的集合;
set(pr) 声明一个空的按函数对象pr排序的集合;
set(pr,al) 声明一个和上面一样的集合,不过他还存储一个分配器对象al;
set(first,last), 声明一个按pred()排序的集合,他的初始内容是指定的序列;
set(first,last,pr) 跟上面一样,不过是按pr排序的集合;
set(first,last,pr,al) 跟上面一样,不过还存储一个分配器对象al;
函数:
clear 删除所有的元素;
erase 删除it指定的元素,返回一个迭代器指向被删除元素的下一个元素;
insert 插入一个键值为KEY的元素,他的返回值是类pair
find 在被控序列中查找一个键值与key次序相等的元素;(这个函数很奇怪,标准的和定义的返回的可能不同-b-原因蛮......)
lower_bound 查找第一个键值未排在key之前的元素,也就是所有与key相等次序的元素形成的子区间的起始处;
upper_bound 查找第一个键值排在key之后的元素,也就是所有与key相等次序的元素形成的子区间的末端;
equal_range 为了检测序列中所有元素都与key次序相等的子区间,返回迭代器pair
count 检测调用equal_range(key)所得到的子区间的长度;
key_comp 获得构造时候相同的排序规则;mycont.key_comp()(key1,key2)用获得的排序函数比较key1,key2,如果key1就在key2前面就返回TRUE;
value_comp 获得一个可以对mycont元素存储的值进行排序的函数对象,对于set返回值与key_comp()相同;
rend rbegin 相等与容器内的所有东西都反过来,rend中是反过来以后的end......++成了- -
PS: 在multiset中调用insert终会插入一个新的元素函数返回的就是指向这个新元素的迭代器;find如果有许多元素与key相等,返回的将是序列中第一个;
测试:
// new.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "set"
#include "assert.h"
#include "iostream"
using namespace std;
typedef set
typedef multiset
int main(int argc, char* argv[])
{
mycont v0;
assert(v0.empty()&&v0.size()==0);
pair
assert(*pib.first=='a'&&pib.second);
assert(*--v0.end()=='a');
pib=v0.insert('a');
assert(*pib.first='a'&&!pib.second);
assert(*v0.insert(v0.begin(),'b')=='b');//a,b
assert(v0.size()==2);
assert(*v0.erase(v0.begin())=='b'&&v0.size()==1);//b
mycont v1;
assert(v1.empty()&&!v0.empty());
assert(v1==v1&&v0>v1);
assert(v0!=v1&&v1
assert(v0.value_comp()('a','c'));
assert(*v0.find('b')=='b'&&v0.find('z')==v0.end());//如果没有的话就是end();
assert(v0.count('x')==0&&v0.count('b')==1);
v0.insert(v0.begin(),'a'); //a,b自动排序-b-我就说蛮
assert(*v0.lower_bound('a')=='a');
assert(*v0.upper_bound('a')=='b');
mcont v3;
assert(v3.empty()&&v3.size()==0);
assert(*v3.insert('d')=='d');
assert(*v3.insert('d')=='d');
assert(v3.size()==2);
assert(v3.count('z')==0&&v3.count('d')==2);
v3.insert(v3.begin(),'a');//a,d,d看看是不是自动排序
assert(*v3.lower_bound('d')=='d');
assert(*v3.upper_bound('a')=='d');//果然
return 0;
}