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;
}
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/a6283d9bcdbc203ed5bba336f1a19015)
下面是记录输入除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;
}
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;
}
相关文章推荐
- (c++)vector map multimap set 的使用
- JAVA简单理解累计框架 List、Set、Iterator、Map
- C++中Map的使用 (个人简单的对于String的使用)
- c++ stl 使用汇总(string,vector,map,set)
- C++中关联容器map和set使用说明
- C++中防止STL中迭代器失效__map/set等关联容器vector/list/deque等序列容器_如何防止迭代器失效_即erase()的使用
- C++中set,map使用自定义类型
- C++学习笔记——map与set的组合使用
- Map集合遍历的四种方式理解和简单使用
- C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用
- C++中map的简单使用
- STL------list、set、map的简单使用
- Javascript中Map和Set的理解和使用
- STL 之 C++ Map容器的简单使用方法
- C/C++--STL中list,vector,deque,map,set区别、联系和使用场景
- map和set的简单使用
- 一个简单的例子理解C++ map, 运用map统计单词出现的次数
- C++使用Sqlite3的简单案例
- 使用C++的map容器遇到的bug(map/set iterator not dereferencable)
- C++ STL容器的学习使用(vector、queue、list、set、map)