您的位置:首页 > 编程语言 > C语言/C++

C++map和set的简单理解和使用案例

2017-10-16 19:29 344 查看
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。来自:点击打开链接

set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值;另外,还得保证根节点左子树的高度与右子树高度相等。

平衡二叉检索树使用中序遍历算法,检索效率高于vector、deque和list等容器,另外使用中序遍历可将键值按照从小到大遍历出来。

构造set集合主要目的是为了快速检索,不可直接去修改键值。

关于map的文档:点击打开链接

关于set的文档:点击打开链接

输出顺序按内部树的结构输出方式。

/*
* 计算输入的不同单词的个数
* 运用map和set关联容器
* map的特点是其下标不必为整数(通过键来查值)
* 如我们想知道对应的学生列表 姓名-学号
* 那我们可以用map<string,long> 利用姓名(string)就可以查出对应的值(long)
*
* 下面的例子:输入5个string并输出对应字符串出现的次数
*/

#include <iostream>
#include <map>
#include <cstddef>
#include <set>

using namespace std;

int main()
{
map<string , size_t>word_count;//键值对,键和值的映射关系
string word;
int i=0; //限制输入为5个string
while(1){
if(i++>4) break;
cin>>word;
++word_count[word];//这里的word是指的输入的string串,不是一个数字索引,
//word对应的字符串被当作键值对的键录入,并对键值对所对应的值(word_count[word])++操作;
} //这样对应的键值对
//如果我将word_count[word]中的word改为word_count["word"]这样我的输入就都加到了word所对应的键值对了
for(auto &w:word_count)
cout << w.first <<"\t出现次数 "<< w.second<<endl;//first为保存关键字的数据成员,second为保存对应值的数据成员
return 0;
}



下面是记录输入除set容器包含的键外的单词出现次数:

int main(){

map<string, size_t> word_count;
set<string> exclude={"the","a","an"
"The","A","An"};
string word;
int i=0;
while(1){
if(i++>4) break;

cin>>word;
if(exclude.find(word) == exclude.end())//没有查到find会返回尾迭代器,证明没找到
++word_count[word];
}
for(auto &w:word_count)
cout << w.first <<"\t出现次数 "<< w.second<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: