STL之set具体解释(二)

首先来看看set集合容器:

set集合容器实现了红黑树的平衡二叉树数据结构。在插入元素时它会自己主动调整二叉树的排列,把该元素放到适当的位置,而且

保证左右子树平衡。平衡二叉检索树採用中序遍历算法。

对于set,vector,map等等,它们的前向迭代器定义是这种(以set为例):

set<int>::iterator it;

for(it=s.begin();it!=s.end();it++){}

那么反向迭代器呢?

set<int>::reverse_iterator rit;

for(rit=s.rbegin();rit!=s.rend();rit++){}

经常用法:insert(),erase(),find(),clear()

find()方法是查找元素方法。假设找到就返回该元素迭代器的位置,否则就返回最后一个元素后面的一个位置。

这样来使用:

it=s.find(5);

if(it!=s.end()) {}

else            {}

关于比較函数:

假设元素不是结构体。而是基本数据类型,那么就自定义一个比較函数:

[cpp] view
plain
copy

  1. struct cmp
  2. {
  3. bool operator()(const int &a,const int &b)
  4. {
  5. return a>b;
  6. }
  7. };
  8. int main()
  9. {
  10. set<int,cmp> s;
  11. for(int i=1;i<10;i++)
  12. s.insert(i);
  13. set<int,cmp>::iterator it;
  14. for(it=s.begin();it!=s.end();it++)
  15. cout<<*it<<" ";
  16. return 0;
  17. }

假设元素是结构体,那么比較函数直接能够写在结构体里面。

[cpp] view
plain
copy

  1. struct Student
  2. {
  3. string name;
  4. double score;
  5. bool operator < (const Student &a) const
  6. {
  7. return a.score<score;
  8. }
  9. };
  10. set<Student> s;

对于set容器来说。它不能有keyword同样的元素同一时候存在,假设要保留同样的元素,就用multiset多重集合容器。

其基本操作跟set集合容器几乎相同一样。定义方法是:multiset<string> ms;

map映照容器:

map映照容器的元素数据是由一个键值和一个映照数据组成的,键值与映照数据之间具有一一相应关系。

map也是用红黑树实现

的。

同set一样,map不同意插入元素键值同样,而multimap多重应照集合能够同意键值反复。

用法:

[cpp] view
plain
copy

  1. int main()
  2. {
  3. map<string,double> m;
  4. m["Jack"]=98.0;
  5. map<string,double>::iterator it;
  6. for(it=m.begin();it!=m.end();it++)
  7. cout<<(*it).first<<" "<<(*it).second<<endl;
  8. return 0;
  9. }

主要方法有:insert(),clear(),erase(),find()等等,基本跟set一样。对于multimap用法跟map几乎相同一样。

std::pair基本的作用是将两个数据组合成一个数据,两个数据能够是同一类型或者不同类型。

比如 std::pair<int,float> 或者 std::pair<double,double>等。

pair实质上是一个结构体。其基本的两个成员变量

是first和second。这两个变量能够直接使用。

初始化一个pair能够使用构造函数,也能够使用std::make_pair函数。

make_pair函数的定义例如以下:

[cpp] view
plain
copy

  1. template pair make_pair(T1 a, T2 b)
  2. {
  3. return pair(a, b);
  4. }

所以m.insert(pair<string,double>("Luce",88.5));

与 m.insert(make_pair("Luce",88.5)); 是相同的效果。

 

演示样例:

[cpp] view
plain
copy

  1. int main()
  2. {
  3. typedef pair<string,double> lesson;
  4. typedef multimap<string,lesson> stu;
  5. stu a;
  6. a.insert(make_pair("Jack",lesson("math",90.5)));
  7. a.insert(make_pair("Jack",lesson("history",85.5)));
  8. a.insert(make_pair("Luce",lesson("math",99.0)));
  9. map<string,lesson>::iterator it;
  10. for(it=a.begin();it!=a.end();it++)
  11. cout<<(*it).first<<" "<<(*it).second.first<<" "<<(*it).second.second<<endl;
  12. return 0;
  13. }
时间: 2024-08-03 03:54:00

STL之set具体解释(二)的相关文章

Android 布局学习之——Layout(布局)具体解释二(常见布局和布局參数)

 [Android布局学习系列]   1.Android 布局学习之--Layout(布局)具体解释一   2.Android 布局学习之--Layout(布局)具体解释二(常见布局和布局參数)   3.Android 布局学习之--LinearLayout的layout_weight属性   4.Android 布局学习之--LinearLayout属性baselineAligned的作用及baseline    Layout Parameters(布局參数): 在XML文件里,我们常常看到类

Android清单文件具体解释(二) ---- 应用程序权限声明

我们知道,Android系统的各个模块提供了很强大的功能(比方电话,电源和设置等),通过使用这些功能.应用程序能够表现的更强大.更灵活.只是,使用这些功能并非无条件的.而是须要拥有一些权限.接下来,我们就開始解说还有一个很重要的知识点--应用程序权限声明.当中主要包含应用程序的权限声明,自己定义应用程序的訪问权限和SDK版本号限定. 1.<uses-permission>--应用程序的权限申请 权限 描写叙述 android.permission.ACCESS_NETWORK_STATE 同意

android动画具体解释二 属性动画原理

property动画是一个强大的框架,它差点儿能使你动画不论什么东西. 你能够定义一个动画来改变对象的不论什么属性,不论其是否被绘制于屏幕之上. 一个属性动画在一定时间内多次改变一个属性(对象的一个字段)的值.要动画某个东西.你需指定对象的目标属性.比方位置,动画的持续时间.和改变的值的范围. 属性动画系统同意你指定下面动画属性: · Duration: 动画持续时间. 默认是300 ms. · Time interpolation: 你能够指定一个函数来定义怎样跟据当前的时间计算属性的值. ·

Android WebView 开发具体解释(二)

转载请注明出处  http://blog.csdn.net/typename/article/details/39495409 powered by miechal zhao 概览: Android WebView 做为承载网页的载体控件,他在网页显示的过程中会产生一些事件,并回调给我们的应用程序,以便我们在网页载入过程中做应用程序想处理的事情.比方说client须要显示网页载入的进度.网页载入错误发生等等事件. WebView提供两个事件回调类给应用层,分别为WebViewClient,Web

stl非变易算法(二)

这里接着上篇stl非变易算法(一)进行总结.主要解析算法函数count.count_if.mismatch.equal.search.search_n以及find_end,给出算法函数的实现及测试用例.下面直接进入正题. 统计等于某值的容器元素个数count count函数用于计算容器中某个给定值的出现次数.计算迭代区间[first,last)上等于val值的元素个数ret,返回计数. //count算法函数的实现代码 template <class InputIterator, class T

Netty4具体解释二:开发第一个Netty应用程序

    既然是入门,那我们就在这里写一个简单的Demo,client发送一个字符串到server端,server端接收字符串后再发送回client. 2.1.配置开发环境 1.安装JDK 2.去官网下载jar包 (或者通过pom构建) 2.2.认识下Netty的Client和Server 一个Netty应用模型,例如以下图所看到的,但须要明确一点的是,我们写的Server会自己主动处理多client请求,理论上讲,处理并发的能力决定于我们的系统配置及JDK的极限. Client连接到Server

Android中Intent具体解释(二)之使用Intent广播事件及Broadcast Receiver简单介绍

通过第一篇的解说,我们已经看到了怎样使用Intent来启动新的应用程序组件,可是实际上他们也能够使用sendBroadcast方法来在组件间匿名的广播消息. 作为一个系统级别的消息传递机制,Intent能够在进程之间发送结构化的消息. 因此,通过实现Broadcast Receiver来监听和响应应用程序内的这些Broadcast Intent. 通过使用Intent来广播一个事件,能够在不改动原始的应用程序的情况下.让我们开发者对事件做出反应.Android大量使用了Broadcast Rec

JAVA代码发送邮件示例和解释(二)

之前有使用过一次在程序中发邮件的功能,也写了一篇相关的笔记,当时使用的是163邮箱,经过测试多个163账号都是可行的.但是最近把账号换成中国移动@chinamobilesz.com这种结尾的时候,却一直连接不上服务器,验证不通过,于是只好重新进行了一些改动,这期间也有参考另一个同事之前的写法,成功实现. 这种实现方式和上一种大同小异,只是经过测试后,这种方式不仅163的邮箱没有问题,中国移动@chinamobilesz.com这种也可以,因此相对前边写的那种应该要更好一些,具体代码如下: pac

STL vector方法总结(二)Iterators(35)

这里是vector的所有构造方法,成员方法的一些总结,具体的可以详看后面的链接. public member function <vector> std::vector::begin C++98 C++11 iterator begin(); const_iterator begin() const; 该方法返回一个指向该vector中第一个元素的iterator. 需要注意的是,和front()方法不同,front是返回第一个元素的引用,而begin返回的是一个指向第一个元素的随机访问迭代器