博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STL学习笔记(关联式容器)
阅读量:4576 次
发布时间:2019-06-08

本文共 5766 字,大约阅读时间需要 19 分钟。

Set和Multisets

set和multiset会根据特定的排序准则,自动将元素排序。两者不同在于multisets允许元素重复而set不允许。

1.set和multiset的操作函数

生成、复制和销毁

set c              //产生一个空的set/multiset,其中不含任何元素set c(op)          //以op为排序准则,产生一个空的set/mulitsetset c1(c2)         //产生某个set/multiset的副本,所有元素均被复制set c(beg,end)     //以区间[beg;end)内的元素产生一个set/multisetset c(beg,end,op)  //以op为排序准则,利用[beg;end]内的元素生成一个set/multisetc.~set()           //销毁所有元素,释放内存

其中set可为下列形式:

set
//一个set,以less<>(operator<)为排序准则set
//一个set,以op为排序准则multiset
//一个multiset,以less<>(operator<)为排序准则multiset
//一个multiset,以op为排序准则

特殊的搜寻函数

count(elem)       //返回“元素值为elem”的元素个数find(elem)        //返回"元素值为elem"的第一个元素的位置,如果找不到就返回end()lower_bound(elem) //返回elem的第一个可安插位置,也就是“元素值>=elem”的第一个元素位置upper_bound(elem) //返回elem的最后一个可安插位置,也就是“元素值>elem”的第一个元素位置equal_range(elem) //返回elem可安插的第一个位置和最后一个位置,也就是“元素值==elem”的元素区间

下面是后面三个函数的一个例子

1 #include 
2 #include
3 using namespace std; 4 5 int main() 6 { 7 set
c; 8 c.insert(1); 9 c.insert(2);10 c.insert(4);11 c.insert(5);12 c.insert(6);13 cout<<"lower_bound(3): "<<*c.lower_bound(3)<
View Code

赋值

set和multiset只提供所有容器都提供的基本赋值操作

这些操作函数中,赋值操作的两端容器必须具有相容型别,而“比较准则”本身可以不同。如果准则不同,准则本身也会被赋值或交换

c1=c2        //将c2中所有元素赋值给c1c1.swap(c2)  //将c1和c2的元素交换swap(c1,c2)  //同上,此为全局函数

元素的安插和移除

c.insert(elem)      //安插一份elem副本,返回新元素位置c.insert(pos,elem)  //安插一份elem副本,返回新元素位置(pos只是个提示)c.insert(beg,end)   //将区间[beg;end)内所有元素的副本安插到c(无返回值)c.erase(elem)       //移除“与elem相等”的所有元素,返回被移除的元素个数c.erase(pos)        //移除迭代器pos锁指位置上的元素,无返回值c.erase(beg,end)    //移除区间[beg;end)内所有元素,无返回值c.clear()           //移除全部元素,将整个容器清空

因为set的元素不可以重复,因此安插动作可能会失败。为此set提供了如下接口来判断安插动作是否成功:

pair
insert(const value_type& elem);

其中pair结构中second成员表示安插是否成功,first成员返回新元素的位置。

因为对迭代器操作而言,set和multiset所有元素都被视为常数,因此无法对其元素调用任何变动性算法。例如:remove()(因为remove()算法实际上是以一个参数值覆盖被移除的元素)。

如果要移除元素,只能使用它们所提供的成员函数。

2.set和multiset运用实例

1 #include 
2 #include
3 #include
4 using namespace std; 5 6 int main() 7 { 8 typedef set
> IntSet; 9 IntSet coll1;10 coll1.insert(4);11 coll1.insert(3);12 coll1.insert(5);13 coll1.insert(1);14 coll1.insert(6);15 coll1.insert(2);16 coll1.insert(5);17 IntSet::iterator pos;18 for(pos=coll1.begin();pos!=coll1.end();++pos)19 cout<<*pos<<' ';20 cout<
status=coll1.insert(4);22 if(status.second)23 cout<<"4 inserted as element "<
<
coll2(coll1.begin(),coll1.end());27 copy(coll2.begin(),coll2.end(),ostream_iterator
(cout," "));28 cout<
(cout," "));34 cout<
View Code

 

 

Map和Multimap

Map和Multimap将key/value当做元素,进行管理,他们可根据key的排序准则自动将元素排序。multimap允许重复元素(key值),maps不允许。

1.map和multimap的操作函数

生成、复制和销毁(跟set一样)

map c              //产生一个空的map/multimap,其中不含任何元素map c(op)          //以op为排序准则,产生一个空的map/mulitmapmap c1(c2)         //产生某个map/multimap的副本,所有元素均被复制map c(beg,end)     //以区间[beg;end)内的元素产生一个map/multimapmap c(beg,end,op)  //以op为排序准则,利用[beg;end)内的元素生成一个map/multimapc.~map()           //销毁所有元素,释放内存

其中,map可为下列形式:

map
//一个map,以less<>(operator<)为排序准则map
//一个map,以op为排序准则multimap
//一个multimap,以less<>(operator<)为排序准则multimap
//一个multimap,以op为排序准则

map和multimap也有类似于set和multiset的特殊搜寻操作函数

count(key)       //返回“键值为key”的元素个数find(key)        //返回"键值为key"的第一个元素的位置,如果找不到就返回end()lower_bound(key) //返回"键值为key"的元素的第一个可安插位置,也就是“键值>=key”的第一个元素位置upper_bound(key) //返回“键值为key”的元素的最后一个可安插位置,也就是“键值>key”的第一个元素位置equal_range(key) //返回“键值为key”的元素可安插的第一个位置和最后一个位置,也就是“键值==key”的元素区间

与set和multiset一样,在map和multimap中(实际型别是pair<const key,T>),所有元素的key都被视为常数,因此不能对其调用任何变动性算法,也不能直接修改key(但是可以修改value)。

map和multimap的元素安插和移除函数跟set和multiset一样。不同的是map跟multimap安插和删除的是key/value值。

将map视为关联式数组

map提供下标操作符,支持元素的直接存取

m[key]  //返回一个reference,指向键值为key的元素。如果该元素尚未存在,就安插该元素

2.map和multimap的运用实例

1 #include 
2 #include
3 #include
4 using namespace std; 5 6 int main() 7 { 8 typedef map
StringFloatMap; 9 StringFloatMap stocks;10 stocks["BASF"]=369.50;11 stocks["VM"]=413.50;12 stocks["Daimler"]=819.00;13 stocks["BMW"]=834.00;14 stocks["Siemens"]=842.20;15 StringFloatMap::iterator pos;16 for(pos=stocks.begin();pos!=stocks.end();++pos)17 {18 cout<<"stock: "<
first<<"\t"19 <<"price: "<
second<
second*=2;24 for(pos=stocks.begin();pos!=stocks.end();++pos)25 {26 cout<<"stock: "<
first<<"\t"27 <<"price: "<
second<
first<<"\t"35 <<"price: "<
second<
View Code

下面例子展示如何将multimap当做一个字典来使用

1 #include 
2 #include
3 #include
4 #include
5 using namespace std; 6 7 int main() 8 { 9 typedef multimap
StrStrMap;10 StrStrMap dict;11 dict.insert(make_pair("day","Tat"));12 dict.insert(make_pair("strange","fremd"));13 dict.insert(make_pair("car","Auto"));14 dict.insert(make_pair("smart","elegant"));15 dict.insert(make_pair("trait","Merkmak"));16 dict.insert(make_pair("strange","seltsam"));17 dict.insert(make_pair("smart","raffiniert"));18 dict.insert(make_pair("smart","klug"));19 dict.insert(make_pair("clever","raffiniert"));20 StrStrMap::iterator pos;21 cout.setf(ios::left,ios::adjustfield);22 cout<<' '<
<<"english "<<"german "<
first.c_str()27 <
second<
second<
second==word)39 cout<<" "<
first<
View Code

 

转载于:https://www.cnblogs.com/runnyu/p/4819496.html

你可能感兴趣的文章
js return的用法
查看>>
子节点填充父元素除去一固定高度后的剩余高度
查看>>
[原]IOS 后台发送邮件
查看>>
(转)JAVA Calendar详解
查看>>
转: 编码,charset,乱码,unicode,utf-8与net简单释义
查看>>
C#--正则匹配
查看>>
5.30 考试修改+总结
查看>>
BA-设计施工调试流程
查看>>
C#-CLR各版本特点
查看>>
css3背景透明文字不透明
查看>>
《java JDK7 学习笔记》之接口与多态
查看>>
LeetCode 96:Unique Binary Search Trees
查看>>
kernel-char设备的建立
查看>>
DVWA-CSRF
查看>>
ubuntu common software introduction
查看>>
资源相互引用时 需添加 PerformSubstitution=True
查看>>
MapRedece(单表关联)
查看>>
蒲公英App开发之检测新版本
查看>>
【安卓基础】倒计时按钮封装(验证码倒计时按钮)
查看>>
configparser模块
查看>>