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 成员,因此若要对此做相应的操作,直接访问即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)