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

发布时间 2023-11-12 13:20:26作者: 雨和风

这篇文章是我在学习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 成员,因此若要对此做相应的操作,直接访问即可。