(C++ 11) 关联容器

来源:互联网 发布:微信红包埋雷必中软件 编辑:程序博客网 时间:2024/05/17 11:58

关联容器概述

关联容器支持高效的关键字查找和访问。两个主要的关联容器类型是map和set。map很适合对一些对象按某个特征进行访问的情形,例如可按照学生姓名来查询学生信息,即可将学生姓名作为关键字,将学生信息作为元素值。set就是集合类型,可保存特定值的集合(通常是满足/不满足某种要求的值集合)。
类型map和multimap保存在头文件map中;set和multiset保存在头文件set中;无序容器则定义在头文件unordered_map和unordered_set中。
例:编写单词计数程序,要求:(1)忽略大小写和标点,例如”example.”、”example,”和”Example”都应看作一个单词;(2)忽略冠词与定冠词”a”、”an”和”the”。

#include <iostream>#include <fstream>#include <map>#include <set>#include <string>#include <iomanip>using namespace std;string & trans(string & s){    for (unsigned int i = 0; i < s.size(); i++)    {        if (s[i] >= 'A' && s[i] <= 'Z')            s[i] += 'a' - 'A';        else if (s[i] == ',' || s[i] == '.')            s.erase(i, 1);    }    return s;}int main(){    ifstream in("D:\\C++\\example\\fiotest.txt");    if (!in)    {        cerr << "打开输入文件失败!" << endl;        exit(1);    }    map<string, size_t> wordCount;    set<string> exclude = { "the", "a", "an" };    string word;    while (in >> word)    {        trans(word);        if (exclude.find(word) == exclude.end())            ++wordCount[word];    }           // 设置左对齐    cout.flags(ios::left);    for (const auto &w : wordCount)        cout << setw(6) << w.first << " 出现了 " << w.second << " 次" << endl; //第一列的宽度为6个字符    return 0;}

C++ primer(第五版)练习11.7

#include <iostream>#include <vector>#include <string>#include <map>using namespace std;void addFamily(map<string, vector<string>> & families, const string & family){    //方式一    //若在容器中找不到相应的家庭,则创建一个空的vector<string>    if (families.find(family) == families.end())        families[family] = vector<string>();    //方式二    //当该家庭已经存在时,此语句只是获取其vector    //若该家庭不存在,标准库map的实现机制是在容器中为该关键字创建一个对象,    //进行默认初始化,即构造一个空vector    //families[family];}void addChild(map<string, vector<string>> & families, const string & family, const string & child){    //当家庭存在时,将孩子的名字追加到现有的vector的末尾    //若家庭不存在,标准库会先创建一个新的vector,然后再将孩子名字添加进去    families[family].push_back(child);}int main(){    map<string, vector<string>> families;    addFamily(families, "张");    addChild(families, "张", "强");    addChild(families, "张", "刚");    addChild(families, "王", "五");    addFamily(families, "王");    for (auto f : families)    {        cout << f.first << "家的孩子:";        for (auto c : f.second)            cout << c << " ";        cout << endl;    }    return 0;}

C++ primer(第五版)练习11.12

#include <iostream>#include <fstream>#include <utility>#include <map>#include <vector>#include <string>#include <iomanip>using namespace std;int main(){    ifstream in("D:\\C++\\example\\fiotest.txt");    if (!in)    {        cerr << "打开输入文件失败!" << endl;        exit(1);    }    vector<pair<string, int>> data;    string s;    int i;    while (in >> s && in >> i)        //data.push_back(pair<string, int>(s, i)); //方式一        //data.push_back({ s, i }); //方式二        data.push_back(make_pair(s, i)); //方式三    cout.flags(ios::left);    for (const auto &d : data)        cout << setw(6) << d.first << " " << d.second << endl;    return 0;}

关联容器操作

一个单词转换的map程序

#include <iostream>#include <fstream>#include <sstream>#include <map>#include <string>using namespace std;map<string, string> buildMap(ifstream &mapFile){    map<string, string> transMap;    string key, value;    while (mapFile >> key && getline(mapFile, value))    {        if (value.size() > 1)            transMap[key] = value.substr(1);        else            throw runtime_error("no rule for " + key);    }    return transMap;}const string & transform(const string &s, const map<string, string> &m){    auto mapIt = m.find(s);    if (mapIt != m.end())        return mapIt->second;    else        return s;}void wordTransform(ifstream &mapFile, ifstream &input){    auto transMap = buildMap(mapFile);    string text;    while (getline(input, text))    {        istringstream stream(text);        string word;        bool firstWord = true;        while (stream >> word)        {            if (firstWord)                firstWord = false;            else                cout << " ";            cout << transform(word, transMap);        }        cout << endl;    }}int main(){    ifstream mapFile("D:\\C++\\example\\mapFile.txt");    ifstream input("D:\\C++\\example\\input.txt");    if (!mapFile)    {        cerr << "打开 mapFile 文件失败!" << endl;        exit(1);    }    if (!input)    {        cerr << "打开 input 文件失败!" << endl;        exit(1);    }    wordTransform(mapFile, input);    return 0;}
0 0
原创粉丝点击