set与map容器

        分类:             C/C++              2013-08-25 19:21     560人阅读     评论(0)     收藏     举报    

首先来看看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            {}

关于比较函数:

如果元素不是结构体,而是基本数据类型,那么就自己定义一个比较函数:

  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. }
struct cmp
{
bool operator()(const int &a,const int &b)
{
return a>b;
}
}; int main()
{
set<int,cmp> s;
for(int i=1;i<10;i++)
s.insert(i);
set<int,cmp>::iterator it;
for(it=s.begin();it!=s.end();it++)
cout<<*it<<" ";
return 0;
}

如果元素是结构体,那么比较函数直接可以写在结构体里面。

  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;
struct Student
{
string name;
double score;
bool operator < (const Student &a) const
{
return a.score<score;
}
}; set<Student> s;

对于set容器来说,它不能有关键字相同的元素同时存在,如果要保留相同的元素,就用multiset多重集合容器。

其基本操作跟set集合容器差不多一样。定义方法是:multiset<string> ms;

map映照容器:

map映照容器的元素数据是由一个键值和一个映照数据组成的,键值与映照数据之间具有一一对应关系。map也是用红黑树实现

的。同set一样,map不允许插入元素键值相同,而multimap多重应照集合可以允许键值重复。

使用方法:

  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. }
int main()
{
map<string,double> m;
m["Jack"]=98.0;
map<string,double>::iterator it;
for(it=m.begin();it!=m.end();it++)
cout<<(*it).first<<" "<<(*it).second<<endl;
return 0;
}

主要方法有: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函数的定义如下:

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

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

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

示例:

  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. }

set和map和pair 转自ACdreamers的更多相关文章

  1. C++ map.insert: pair和make_pair区别

    C++ map.insert: pair和make_pair区别 \*********************************\ map<uint32_t, string> tem ...

  2. STL之map与pair与unordered_map常用函数详解

    STL之map与pair与unordered_map常用函数详解 一.map的概述 map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称 ...

  3. c++map按value排序--将map的pair对保存到vector中,然后写比较仿函数+sort完成排序过程。

    map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行 ...

  4. CF988 C. Equal Sums【map+pair/hash/任选两个序列,两个序列都除去他们中的一个数,使的总和相同】

    [链接]:CF988C [题意]:在n个序列中任选两个序列,两个序列都除去他们中的一个数,使的总和相同 [分析]:map<int,pair<int,int> > mp,从0~m ...

  5. Codeforces Round #486 (Div. 3) C "Equal Sums" (map+pair<>)

    传送门 •题意 给k个数列,从中k个数列中找出任意2个数列 i ,j 使得数列i删除第x个数,和数列j删除第y个数的和相等 若存在,输出 i ,x 和 j,y •思路 每个数列之间的联系为数列的和之间 ...

  6. map set区别

    STL中的容器有顺序容器 (vector,list,deque),关联容器(map,set)还有一些其他容器.根据不同的场合选择不同的容器,会有意想不到的收获. Map是单词mapping(映射)的缩 ...

  7. codeforces 651C(map、去重)

    题目链接:http://codeforces.com/contest/651/problem/C 思路:结果就是计算同一横坐标.纵坐标上有多少点,再减去可能重复的数量(用map,pair存一下就OK了 ...

  8. C++回顾map的用法

    map<T, T>是C++的STL中存储key-value键值对数据结构的最基础的模板类,相对于multimap可以重复的key值,map的key是非重复的. C++的reference这 ...

  9. 4.3 map和multimap

    使用map multimap必须包含头文件map *:multimap 1)multimap定义 template<class Key,class Pred=less<Key>,cl ...

随机推荐

  1. Java中的定时调度

    Timer类是一个线程设施,用于实现在某个时间或者某一段时间后安排某个任务执行一次或者定期重复执行.需要与TimerTask配合使用. TimerTask类用来实现由Timer安排的一次或重复执行的某 ...

  2. JAVA 调用matlab 出错总结

    1.Java:Unsupported major.minor version 51.0 (unable to load class 出现该错误是由于class编译器的JDK版本高于运行期的JDK版本. ...

  3. Android progressbar 详解

    [原文Android学习笔记(十六)进度条] ProgressBar XML属性 属性名 描述 android:animationResolution 超时的动画帧之间的毫秒 :必须是一个整数值,如“ ...

  4. WIN API 擦除所绘图像

    COLORREF circle_color = RGB(0, 105, 255); //获取窗口DC HDC hdc = GetDC(hWnd_); //背景色透明 SetBkMode(hdc, TR ...

  5. xcode 路径

    $(SRCROOT)宏和$(PROJECT_DIR)宏 XCode环境变量及路径设置 分类: Objective-C2013-03-11 12:30 41336人阅读 评论(1) 收藏 举报 一般我们 ...

  6. .Net程序员安卓学习之路5:使用xutils注入View和事件以及图片的显示

    xUtils注入和图片显示 一.xUtils注入 引用官方介绍: ViewUtils模块: •android中的ioc框架,完全注解方式就可以进行UI,资源和事件绑定: •新的事件绑定方式,使用混淆工 ...

  7. [LeetCode]题解(python):032-Longest Valid Parentheses

    题目来源 https://leetcode.com/problems/longest-valid-parentheses/ Given a string containing just the cha ...

  8. 判断cdn上的图片可以正常访问到

    昨天晚上cdn宕机1小时,要对上传的资检查,写了个简单的小脚本来实现上传过的资源都是正常的(其实非必须),就是练手防止生疏. arr.each do |a | res = Net::HTTP.get_ ...

  9. JavaScript学习基础部分

    JavaScript学习基础 一.简介 1.JavaScript 是因特网上最流行的脚本语言,并且可在所有主要的浏览器中运行,比方说 Internet Explorer. Mozilla.Firefo ...

  10. Selenium2学习-027-WebUI自动化实战实例-025-JavaScript 在 Selenium 自动化中的应用实例之三(页面滚屏,模拟鼠标拖动滚动条)

    日常的 Web UI 自动化测试过程中,get 或 navigate 到指定的页面后,若想截图的元素或者指定区域范围不在浏览器的显示区域内,则通过截屏则无法获取相应的信息,反而浪费了无畏的图片服务器资 ...