(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
- C++primer 关联容器
- 《C++primer》关联容器
- C++MAP关联容器
- C++map关联容器
- 数据结构-关联容器(C++)
- C++----关联容器
- 关联容器(Java/C++)
- 重新学习《C++Primer5》第11章-关联容器
- 《C++Primer》读书笔记——第11章 关联容器
- c++primer第十一章关联容器小结-11
- C++Primer_第11章_关联容器
- (C++ 11) 关联容器
- 11-关联容器
- 11章,关联容器
- 【C/C++】关联容器pair map set
- C++-关联容器类型map
- c++Primer笔记(十 关联容器)
- C ++ primer 中说的关联容器
- Android 好看的搜索界面,大赞Animation
- libxml2交叉移植总结
- casperjs/phantomjs资料收集
- ATSAMA5D35下pcf8563 i2c驱动分析
- struts2 和 ajax的交互
- (C++ 11) 关联容器
- mongodb查询数字开头的集合报错
- 点击文字弹出图片层
- CPPUTest
- Android之如何在XML中添加单击事件
- MVC 页面跳转
- 迈进写博客的第一步大门
- Android Studio中R文件丢失
- ngx_lua模块学习笔记