C++PRIMER PLUS 第五版 习题集随笔

这篇文章是我在学习C++PRIMER 习题集时 ,遇到我认为有必要笔记下来的内容。

思考:

请思考如何写一个单词计数程序:

要求:
1.请使用map容器

2.请使用insert迭代器代替下标操作

代码示例:

#include<iostream>
#include<map>
#include<string>
#include<fstream>
#include<algorithm>
using namespace std;
int main(int argc,char**argv){
	ifstream in(argv[1])//此处使用命令行参数传入要写入的文件名
    if(!in){
        cerr<<"打开文件失败"<<endl;
        return -1;
    }
    map<string,size_t>word_cnt;//声明一个string指向size_t的map容器
    string word;
    while(in>>word){
        auto ret = word_cnt.insert({word,1});//插入一对键值对
        if(!ret.second){//判断是否插入成功,若容器已存在该键值,则插入失败
            ++ret.first->second;//因键值事先存在,说明单词出现不止一次,次数+1
        }
    }
    for(const auto &w:word_cnt){
        cout<<w.first<<" occure "<<w.second<<"times"<<endl;
    }
    return 0;
}

分析

​原先的map容器并无定义bool类型,但我们尝试去插入一个键值对后,却有一个bool返回值来来协助我们判断是否能插入。这是为什么呢? 其原因很简单,insert的返回值给我们包装了一个新map迭代器,原先map的迭代器,value_type(值类型)为 pair<const string,size_t>,在insert接受到我们使用pair简洁的列表初始化{value1,value2},({word,1})后包装了一个value_type为pair<const pair<const string,int>,bool>的新迭代器供我们使用,我们只需要访问底层pair的second成员,即可获得插入是否成功的结果,而first成员依旧拷贝保留着我们当初迭代器的first 和second 成员,因此若要对此做相应的操作,直接访问即可。

posted @   雨和风  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示