stl中map与set

来源:互联网 发布:java string 编码 编辑:程序博客网 时间:2024/05/18 00:52

set:

1、set特性:所有元素都会根据元素的键值自动被排序,set的元素不像map那样可以同时拥有实值和键值,set元素的键值就是实值,实值就是键值。set不允许两个元素有相同的键值;set的元素值不允许被改变。

2、set拥有与list相同的某些性质:当客户端对它进行元素新增操作或者删除操作时,操作之前的所有迭代器,在操作完成之后都依然有效。

3、set以RB-tree为底层机制,又由于set所开放的各种操作接口,RB-tree也都提供了,所以几乎所有的set操作行为,都只是转调用RB-tree的操作行为而已。

下面是一个小小的set的测试程序

#include<iostream>
#include<set>
using namespace std;
int main(){
int i;
int ia[5]={1,2,3,4,5};
set<int> iset(ia,ia+5);
cout<<"size="<<iset.size()<<endl;
cout<<"3 count="<<iset.count(3)<<endl;           //count函数返回的是size_type类型,返回0或者1;
iset.insert(3);//当插入重复的会自动删除;
cout<<"size="<<iset.size()<<endl;
cout<<"3 count="<<iset.count(3)<<endl;
iset.insert(0);
for(auto i=iset.begin();i!=iset.end();++i)
cout<<*i<< ' ';
cout<<endl;
iset.erase(1);
for(auto i=iset.begin();i!=iset.end();++i)
cout<<*i<< ' ';
if(iset.find(1)!=iset.end())
cout<<" yes";
else cout<<" no ";
cout<<endl;

auto it=iset.upper_bound(1);                                     //upper_bound()返回大于键值的第一个iterator;lower_bound()返回大于或等于键值的第一个iterator;
cout<<*it<<endl;

return 0;
}


map:

1、map特性:所有元素都会根据元素的键值自动被排序,map的所有元素都是pair,同时拥有实值和键值。pair的第一元素被视为键值,第二元素被视为实值。map不允许两个元素拥有相同的键值。

pair的定义:

template<class T1, class T2>

struct pair{

typedef T1 first_type;

typedef T2 second_type;

T1 first;

T2 second;

pair() : first(T1()),second(T2()){}

pair(const T1& a, const T2& b) : first(a), second(b){}

};

2、同样的pair的键值是不能修改的,因为map元素的键值关系到map元素的排列规则。但却可以修正map元素的实值。

3、map拥有与list相同的某些性质:当客户端对它进行元素新增操作或者删除操作时,操作之前的所有迭代器,在操作完成之后都依然有效。

4、map以RB-tree为底层机制,又由于map所开放的各种操作接口,RB-tree也都提供了,所以几乎所有的map操作行为,都只是转调用RB-tree的操作行为而已。

下面一个小测试例子:

#include<iostream>
#include<map>
using namespace std;
int main(){

map<int,string> simap;
simap[1]="jjhou";
simap[2]="jerry";
simap[3]="jason";
simap[4]="jimmy";

pair<int,string> value(5,string("david"));
simap.insert(value);

map<int,string>::iterator simap_iter=simap.begin();
for(;simap_iter!=simap.end();++simap_iter)
cout<<simap_iter->first<<' '<<simap_iter->second<<endl;

if(simap.find(1)!=simap.end())
cout<<"yes"<<endl;

auto iter=simap.lower_bound(3);
cout<<iter->first<<iter->second<<endl;
return 0;

}

原创粉丝点击