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

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






  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值