C++Primer第五版——习题答案详解(十)


习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html

第11章 关联容器


练习11.3

#include<iostream>
#include<string>
#include<map>

using namespace std;

int main() {
    string s;
    map<string, size_t> num;
    cout << "输入单词表:" << endl;
    while (cin >> s) {
        ++num[s];
    }
    for (const auto &i : num) {
        cout << i.first << " occurs " << i.second << ((i.second > 1) ? " times" : " time") << endl;
    }

    system("pause");
    return 0;
}

练习11.4

#include<iostream>
#include<string>
#include<map>
#include<cctype>
using namespace std;

void process(string &s) {
    for (auto i = 0;i < s.size(); ++i) {
        if (isupper(s[i])) s[i] = tolower(s[i]);
        else if (ispunct(s[i])) {
            s.erase(i,1);
        }
    }
}

int main() {
    string s;
    map<string, size_t> num;
    cout << "输入单词表:" << endl;
    while (cin >> s) {
        process(s);
        ++num[s];
    }
    for (const auto &i : num) {
        cout << i.first << " occurs " << i.second << ((i.second > 1) ? " times" : " time") << endl;
    }

    system("pause");
    return 0;
}

练习11.7

#include<map>
#include<vector>
#include<iostream>
#include<string>

using namespace std;

int main() {
    map<string, vector<string>> mp;
    string last_name, first_name;
    cout << "输入姓:" << endl;
    cin >> last_name;
    cout << "输入该姓的成员名字:" << endl;
    while (cin >> first_name) {
        mp[last_name].push_back(first_name);
    }
    for (const auto i : mp) {
        cout << "姓:" << i.first << " 有以下成员:" << endl;
        for (const auto j : i.second) {
            cout << j << " ";
        }
        cout << endl;
    }

    system("pause");
    return 0;
}

练习11.8

#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;

int main() {
    vector<int> v = { 1,1,2,3,4,4,5,6 };
    auto iter = unique(v.begin(), v.end());
    v.erase(iter, v.end());
    for (auto i : v) {
        cout << i << " ";
    }
    cout << endl;
    system("pause");
    return 0;
}

练习11.9

map<string, list<size_t>> mp;

练习11.10
vector可以,因为定义了比较大小的操作,list未定义所以不行。

练习11.11

using compareType = bool (*)(const Sales_data& lhs, const Sales_data& rhs);

练习11.12

#include<vector>
#include<utility>
#include<iostream>
#include<string>
using namespace std;

int main() {
    vector<pair<string,int>> vec;
    size_t i = 0;
    string s;
    int num;
    while (cin >> s >> num) {
        vec.push_back({ s,num });
        ++i;
    }
    for (auto i : vec) {
        cout << i.first << " " << i.second << endl;
    }
    system("pause");
    return 0;
}

练习11.13

#include<vector>
#include<utility>
#include<iostream>
#include<string>
using namespace std;

int main() {
    vector<pair<string,int>> vec;
    size_t i = 0;
    string s;
    int num;
    while (cin >> s >> num) {
        //vec.push_back({ s,num }); 第一种
        vec.emplace_back(s, num); //第二种:最简便
        //vec.push_back(make_pair(str,i));//第三种
        ++i;
    }
    for (auto i : vec) {
        cout << i.first << " " << i.second << endl;
    }
    system("pause");
    return 0;
}

练习11.14

#include<map>
#include<vector>
#include<iostream>
#include<string>
#include<utility>
using namespace std;

int main() {
    map<string, vector<pair<string,string>>> mp;
    string last_name, first_name, birthday;
    cout << "输入姓:" << endl;
    cin >> last_name;
    cout << "输入该姓的成员名字和生日:" << endl;
    while (cin >> first_name >> birthday) {
        mp[last_name].emplace_back(first_name, birthday);
    }
    for (const auto i : mp) {
        cout << "姓:" << i.first << " 有以下成员:" << endl;
        for (const auto j : i.second) {
            cout << j.first << " " << j.second << endl;
        }
        cout << endl;
    }

    system("pause");
    return 0;
}

练习11.15
mapped_type 是vector
key_type 是int
value_type 是pair<int,vector>

练习11.16

#include<map>
#include<iostream>
#include<string>

using namespace std;

int main() {
    map<string, int> mp;
    mp["aaa"] = 1;
    auto iter = mp.begin();
    iter->second = 2;
    //iter->first = "bbb"; const 不允许修改
    cout << iter->first << " " << iter->second << endl;
    system("pause");
    return 0;
}

练习11.17
第三个不合法,back_inserter()需要用到push_back(),而set没有;其余合法。

练习11.18

map<const string,size_t>::iterator

练习11.19

using compareType = bool (*)(const Sales_data &lhs, const Sales_data &rhs);
multiset<Sales_data, compareType> bookstore(compareIsbn);
multiset<Sales_data, compareType>::iterator c_it = bookstore.begin();

练习11.20

#include<iostream>
#include<string>
#include<map>

using namespace std;

int main() {
    map<string, size_t> word_count;
    string word;
    while (cin >> word) {
        auto ret = word_count.insert({ word,1 });
        if (!ret.second) {
            ++ret.first->second;
        }
    }
    for (auto i : word_count) {
        cout << i.first << " " << i.second << endl;
    }

    system("pause");
    return 0;
}

之前的更容易阅读和编写。

练习11.21

word_count.insert({ word,0 }) //得到insert的返回值,是一个pair
word_count.insert({ word,0 }).first //是pair的第一个成员,是一个map迭代器,指向具有给定关键字的元素
word_count.insert({ word,0 }).first -> //解引用此迭代器,提取map中的元素,元素也是一个pair
word_count.insert({ word,0 }).first -> second //map中元素的值部分
++word_count.insert({ word,0 }).first->second //递增此值

练习11.23

#include<map>
#include<vector>
#include<iostream>
#include<string>
using namespace std;

int main() {
    multimap<string, vector<string>> mp;
    vector<string> vs;
    string last_name, first_name;
    cout << "总共有几个姓:" << endl;
    int n, k = 1;
    cin >> n;
    while (n--) {
        cout << "请输入第" << k << "个姓:" << endl;
        cin >> last_name;
        cout << "请输入姓" << last_name << "的成员,并以  END  结束当前输入" << endl;
        while (cin >> first_name) {
            if(first_name!="END") vs.push_back(first_name);
            else break;
        }
        mp.insert({ last_name,vs });
        k++;
    }
    for (const auto i : mp) {
        cout << "姓:" << i.first << " 有以下成员:";
        for (const auto j : i.second) {
            cout << j << " ";
        }
        cout << endl;
    }

    system("pause");
    return 0;
}

练习11.28

#include<iostream>
#include<string>
#include<vector>
#include<map>
using namespace std;

int main() {
    map<string, vector<int>> mp = { { "aa",{1,2,3,4} } };
    auto iter = mp.find("aa");
    cout << iter->first << endl;
    system("pause");
    return 0;
}

练习11.29
upper_bound和lower_bound返回相等的迭代器——指向一个不影响排序的关键字插入位置。

练习11.30
第一个迭代器引用后得到书名。

练习11.31

#include<iostream>
#include<map>
#include<string>

using namespace std;

int main() {
    string search_item = "bbb";
    multimap < string, string > mp = { {"John", "aaa"}, { "John","bbb" }, { "John","ccc" },{"Tom","ddd"} };
    auto iter = mp.find("John");
    auto num = mp.count("John");
    while (num) {
        if (iter->second == search_item) {
            mp.erase(iter);
            break;
        }
        ++iter;
        --num;
    }
    for (auto i : mp) {
        cout << i.first << " " << i.second << endl;
    }
    system("pause");
    return 0;
}

练习11.32

#include<iostream>
#include<map>
#include<string>
#include<set>

using namespace std;

int main() {
    string search_item = "bbb";
    multimap < string, string > mp = { {"John", "baa"}, { "John","abb" }, { "John","ced" },{"Tom","ccc"},{"Bob","zzz"},{"Bob","aae"} };
    map<string, set<string>> ans;
    for (auto i : mp) {
        ans[i.first].insert(i.second);
    }
    for (auto i : ans) {
        cout << i.first << " : ";
        for (auto j : i.second) {
            cout << j << " ";
        }
        cout << endl;
    }

    system("pause");
    return 0;
}

练习11.33

#include<iostream>
#include<string>
#include<map>
#include<fstream>
#include<sstream>

using namespace std;

//函数buildMap读入给定文件,建立起转换映射
map<string, string> buildMap(ifstream &map_file) {
    map<string, string> trans_map;
    string key;
    string value;
    //读取第一个单词存入key中,行中剩余内容存入value
    while (map_file >> key && getline(map_file, value)) {
        if (value.size() > 1) {
            trans_map[key] = value.substr(1); //跳过前导空格
        }
        else {
            throw runtime_error("no rule for " + key);
        }
    }
    return trans_map;
}

//生成文本转换
const string & transform(const string &s, const map<string, string> &m) {
    auto map_it = m.find(s);
    if (map_it != m.cend()) {
        return map_it->second;
    }
    else {
        return s;
    }
}

void word_transform(ifstream &map_file, ifstream &input) {
    auto trans_map = buildMap(map_file);//保存转换规则
    string text;
    while (getline(input, text)) {
        istringstream stream(text); //读取每个单词
        string word;
        bool firstword = true;  //控制是否打印空格
        while (stream >> word) {
            if (firstword) {
                firstword = false;
            }
            else cout << " ";
            //transform返回它的第一个参数或其转换之后的形式
            cout << transform(word, trans_map); 
        }
        cout << endl;
    }
}

int main() {
    ifstream map_file("book.txt"), input("test.txt");
    word_transform(map_file, input);
    system("pause");
    return 0;
}

练习11.34
下标操作,当元素不存在时会隐式地创建一个新元素插入到map中,修改了map

练习11.35
如果有重复的key,则下标表示时新的会替换旧的,而insert不会,那么在transform函数中find会有多个返回值导致出错。

练习11.36

#include<iostream>
#include<string>
#include<map>
#include<fstream>
#include<sstream>

using namespace std;

//函数buildMap读入给定文件,建立起转换映射
map<string, string> buildMap(ifstream &map_file) {
    map<string, string> trans_map;
    string key;
    string value;
    //读取第一个单词存入key中,行中剩余内容存入value
    while (map_file >> key && getline(map_file, value)) {
        if (value.size() > 1) {
            trans_map[key] = value.substr(1); //跳过前导空格
        }
        else {
            throw runtime_error("no rule for " + key);
        }
    }
    return trans_map;
}

//生成文本转换
const string & transform(const string &s, const map<string, string> &m) {
    auto map_it = m.find(s);
    if (map_it != m.cend()) {
        return map_it->second;
    }
    else {
        return s;
    }
}

void word_transform(ifstream &map_file, ifstream &input) {
    auto trans_map = buildMap(map_file);//保存转换规则
    string text;
    while (getline(input, text)) {
        istringstream stream(text); //读取每个单词
        string word;
        bool firstword = true;  //控制首个空格
        while (stream >> word) {
            if (firstword) {
                firstword = false;
            }
            else cout << " ";
            //transform返回它的第一个参数或其转换之后的形式
            cout << transform(word, trans_map); 
        }
        cout << endl;
    }
}

int main() {
    ifstream map_file("book.txt"), input("test.txt");
    word_transform(map_file, input);
    system("pause");
    return 0;
}

练习11.37
无序容器不用排序,效率高。
有序容器可以自定义排序。

练习11.38
单词计数程序

#include <unordered_map>
#include <string>
#include <iostream>

using namespace std;

int main()
{
    unordered_map<string, size_t> word_count;
    string word;
    while(cin >> word)
        ++word_count[word];

    for(const auto &w : word_count)
        cout << w.first << "," << w.second << endl;

    return 0;
}

单词转换程序

#include<iostream>
#include<string>
#include<unordered_map>
#include<fstream>
#include<sstream>

using namespace std;

//函数buildMap读入给定文件,建立起转换映射
unordered_map<string, string> buildMap(ifstream &map_file) {
    unordered_map<string, string> trans_map;
    string key;
    string value;
    //读取第一个单词存入key中,行中剩余内容存入value
    while (map_file >> key && getline(map_file, value)) {
        if (value.size() > 1) {
            trans_map[key] = value.substr(1); //跳过前导空格
        }
        else {
            throw runtime_error("no rule for " + key);
        }
    }
    return trans_map;
}

//生成文本转换
const string & transform(const string &s, const unordered_map<string, string> &m) {
    auto map_it = m.find(s);
    if (map_it != m.cend()) {
        return map_it->second;
    }
    else {
        return s;
    }
}

void word_transform(ifstream &map_file, ifstream &input) {
    auto trans_map = buildMap(map_file);//保存转换规则
    string text;
    while (getline(input, text)) {
        istringstream stream(text); //读取每个单词
        string word;
        bool firstword = true;  //控制首个空格
        while (stream >> word) {
            if (firstword) {
                firstword = false;
            }
            else cout << " ";
            //transform返回它的第一个参数或其转换之后的形式
            cout << transform(word, trans_map); 
        }
        cout << endl;
    }
}

int main() {
    ifstream map_file("book.txt"), input("test.txt");
    word_transform(map_file, input);
    system("pause");
    return 0;
}

转载于:https://www.cnblogs.com/Mered1th/p/10546136.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ Primer习题集(第五版) , 带目录完整版。 --------------------------------------------------------------------------- 目录 第1章............................................................ 1 练习1.1 练 习1.25 第2 章变量和基本类型................................................. 12 练习2.1 练 习2.42 第3 章字符串、向量和数组..............................................37 练习3.1 练 习3.45 第4 章表达式......................................................... 80 练习4.1 练 习4.38 第5 章语句........................................................... 99 练习5.1 练 习5.25 第6 章函数.......................................................... 120 练习6.1 练 习6.56 m m m ...................................................................... 152 练习7.1 练 习7.58 第8 章1 0库..........................................................183 练习8.1 练 习8.14 第9 章顺序容器...................................................... 193 练习9.1 练 习9.52 第10章泛型算法..................................................... 234 练习10.1 练 习10.42 目录 ◄ v 第11章关联容器..................................................... 273 练习11.1 练 习11.38 第12章动态内存..................................................... 297 练习12.1 练 习12.33 第13章拷贝控制..................................................... 331 练习13.1 练 习13.58 第14章重载运算与类型转换............................................368 练习14.1 练 习14.53 第15章面向对象程序设计..............................................399 练习15.1 练 习15.42 第16章模板与泛型编程............................................... 424 练习16.1 练 习16.67 第17章标准库特殊设施............................................... 458 练习17.1 练 习17.39 第18章用于大型程序的工具............................................483 练习18.1 练 习18.30 第19章特殊工具与技术............................................... 502 练习19.1 练 习19.26

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值