您的位置:首页 > 其它

STL之set&multiset容器(笔记)

2007-02-27 20:03 381 查看
这两个容器控制的长度为N的序列是有N节点的红黑树存储的;集合中所有元素都是独一无二的,多重集合中允许存在副本。

模版类set multiset map multimap被称为关联容器,他们都把一个键值于一个元素对应起来,并用该键来查找,插入,删除等操作,他们对插入删除操作取得了比线型时间更好的对数时间效果,当元素增多时他们内部使用的是二分查找,效率更加高效;但如果我们不需要这种额外的效率,就可以避免那些导致好时间带来的可观的复杂度与额外的指针空间;

typedef set<Key,less<Key>,allocator<Key>> mycont;

构造函数

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<iterator,bool>的一个对象只有当被控序列中没有与key次序相等的元素时(这么准确的说应该是相似),second才会为true,first指向被插入的元素;

find 在被控序列中查找一个键值与key次序相等的元素;(这个函数很奇怪,标准的和定义的返回的可能不同-b-原因蛮......)

lower_bound 查找第一个键值未排在key之前的元素,也就是所有与key相等次序的元素形成的子区间的起始处;

upper_bound 查找第一个键值排在key之后的元素,也就是所有与key相等次序的元素形成的子区间的末端;

equal_range 为了检测序列中所有元素都与key次序相等的子区间,返回迭代器pair<iterator,iterator>(mycont.lower_bound(key),mycont.upper_bound(key))对于一个set对象长度要么为0要么为1;

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<char> mycont;
typedef multiset<char> mcont;
int main(int argc, char* argv[])
{
mycont v0;
assert(v0.empty()&&v0.size()==0);
pair<mycont::iterator,bool>pib=v0.insert('a');
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<v0);
assert(v0.key_comp()('a','c'));
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: