【足迹C++primer】38、关联容器操作(2)
https://blog.csdn.net/cutter_point/article/details/35244805
map的下标操作
map和unordered_map容器提供了下标运算符合一个相应的at函数
对于一个map使用下标操作,其行为与数组或vector上的下标操作非常不同样:
使用一个不再容器中的keyword作为下标。会加入一个此keyword的元素到map中
c[k] 返回keyword为k的元素。假设keywordk不再c中,加入一个keyword为k的元素,对其进行值初始化
c.at(k) 訪问keyword为k的元素,带參数检測,假设k不再c重那么返回一个异常,out_of_range
訪问元素
void fun1()
{
set<int> iset={0,1,2,3,4,5,6,7,8,9};
iset.find(1); //返回一个迭代器。指向key==1的元素
iset.find(11); //返回一个迭代器,值指向iset.end()
iset.count(1); //返回1
iset.count(11); //返回0
}
今天上传的有点晚了,放假了,人也懒了- -
对map使用find取代下标操作
void fun2()
{
map<string, size_t> word_count;
string word;
while(cin>>word)
++word_count[word];
if(word_count.find("foobar") == word_count.end())
cout<<"foobar is not in the map "<<endl;
}
在multimap和multiset中查找元素
void fun3()
{
multimap<string, string> authors;
string search_item("Alain de Botton"); //要查找的作者
auto entries=authors.count(search_item); //元素的数量
auto iter=authors.find(search_item); //此作者的第一本书
//用一个循环查找此作者的全部著作
while(entries)
{
cout<<iter->second<<endl; //打印书名
++iter; //指向下一个
--entries; //记录打印了多少书
}
}
一种不同的,面向迭代器的解决方法
假设keyword不在容器中,则lower_bound会返回keyword的第一个安全插入点--不影响
容器中元素顺序的插入位置
void fun4()
{
//authors和search_item的定义,和前面的程序一样
//beg和end表示相应此作者的元素的范围
multimap<string, string> authors;
string search_item("Alain de Botton"); //要查找的作者
for(auto beg=authors.lower_bound(search_item),
end=authors.upper_bound(search_item) ; beg != end; ++beg)
cout<<beg->second<<endl; //打印每一个题目
//upper_bound调用将end指向最后一个匹配search_item的元素的后一位
}
有木有发现,我如今博客越来越顺畅啦,相信大家也看看出来了吧,嘿嘿,我每次都打好底稿。然后再上传,边传边改,这样就不会像曾经那样了,非常乱,并且有点赶时间的嫌疑。
equal_range函数
这个函数接受一个keyword。返回一个迭代器pair,第一个迭代器指向
第一个和keyword匹配的元素,第二个指向和最后一个匹配的元素的后一个位置
void fun5()
{
//authors和search_item的定义,和前面的程序一样
//pos保存迭代器对,表示keyword匹配的元素范围
multimap<string, string> authors;
string search_item("Alain de Botton"); //要查找的作者
pair<multimap<string, string>::iterator, multimap<string, string>::iterator> pos;
for(pos=authors.equal_range(search_item); pos.first != pos.second ; ++pos.first)
cout<<pos.first->second<<endl; //打印每一个题目
}
一个单词转换的map
brb be right back
k okay?
y why
r are
u you
pic picture
thk thanks!
18r later
where r u
y dont u send me a pic
k thk 18r
where are you
why dont you send me a picture
okay?
thanks! later
#include<iostream>
#include<fstream>
#include<sstream>
#include<map>
#include<set>
#include<string>
#include<utility> //pair
using namespace std;
map<string, string> bulidMap(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) //坚持是否有转换规则
{
value=value.substr(1); //跳过前导空格
//插入map
trans_map.insert({key, value});
}
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);
//假设单词在转换规则map中
if(map_it != m.cend())
{
return map_it->second; //使用替换短语
}
else
{
return s; //返回原值
}
}
void word_transform(ifstream &map_file, ifstream &input)
{
auto trans_map=bulidMap(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<<endl<<"-------------------------------------"<<endl;
// cout<<"这个单词是:"<<word<<endl;
// cout<<"-------------------------------------"<<endl;
cout<<transform(word, trans_map); //打印输出
}
cout<<endl; //完毕一行的转换
}
}
int main()
{
ifstream map_file,input;
map_file.open("map_file.txt");
input.open("input.txt");
word_transform(map_file, input);
map_file.close();
input.close();
return 0;
}
好的劳动了一上午的成果!!
!
/**
* 功能:关联容器操作
* 时间:2014年6月27日09:55:55
* 作者:cutter_point
*/
#include<iostream>
#include<fstream>
#include<sstream>
#include<map>
#include<set>
#include<string>
#include<utility> //pair
using namespace std;
//map的下标操作
//map和unordered_map容器提供了下标运算符合一个相应的at函数
//对于一个map使用下标操作。其行为与数组或vector上的下标操作非常不同样:
//使用一个不再容器中的keyword作为下标。会加入一个此keyword的元素到map中
/*
map和unordered_map的下标操作
c[k] 返回keyword为k的元素。假设keywordk不再c中,加入一个keyword为k的元素,对其进行值初始化
c.at(k) 訪问keyword为k的元素,带參数检測。假设k不再c重那么返回一个异常,out_of_range
*/
//与vector和string不同,map下标运算符返回的类型与解引用map迭代器得到的类型不同。
//訪问元素
//假设我们关心的仅仅只是是特定元素是否在容器中的时候,find是最佳的选择
void fun1()
{
set<int> iset={0,1,2,3,4,5,6,7,8,9};
iset.find(1); //返回一个迭代器。指向key==1的元素
iset.find(11); //返回一个迭代器,值指向iset.end()
iset.count(1); //返回1
iset.count(11); //返回0
}
//对map使用find取代下标操作
//下标操作会自己主动加入元素,不好
void fun2()
{
map<string, size_t> word_count;
string word;
while(cin>>word)
++word_count[word];
if(word_count.find("foobar") == word_count.end())
cout<<"foobar is not in the map "<<endl;
}
//在multimap和multiset中查找元素
//当我们遍历multimap和multiset的时候,保证能够得到序列中全部具有给定keyword的元素
void fun3()
{
multimap<string, string> authors;
string search_item("Alain de Botton"); //要查找的作者
auto entries=authors.count(search_item); //元素的数量
auto iter=authors.find(search_item); //此作者的第一本书
//用一个循环查找此作者的全部著作
while(entries)
{
cout<<iter->second<<endl; //打印书名
++iter; //指向下一个
--entries; //记录打印了多少书
}
}
//一种不同的,面向迭代器的解决方法
/*
lower_bound返回迭代器可能指向一个具有给定keyword的元素,但也可能不指向。
假设keyword不在容器中。则lower_bound会返回keyword的第一个安全插入点--不影响
容器中元素顺序的插入位置
*/
void fun4()
{
//authors和search_item的定义,和前面的程序一样
//beg和end表示相应此作者的元素的范围
multimap<string, string> authors;
string search_item("Alain de Botton"); //要查找的作者
for(auto beg=authors.lower_bound(search_item),
end=authors.upper_bound(search_item) ; beg != end; ++beg)
cout<<beg->second<<endl; //打印每一个题目
//upper_bound调用将end指向最后一个匹配search_item的元素的后一位
}
//equal_range函数
/*
不用lower_bound和upper_bound直接调用equal_range就可以。
这个函数接受一个keyword。返回一个迭代器pair。第一个迭代器指向
第一个和keyword匹配的元素,第二个指向和最后一个匹配的元素的后一个位置
*/
void fun5()
{
//authors和search_item的定义,和前面的程序一样
//pos保存迭代器对。表示keyword匹配的元素范围
multimap<string, string> authors;
string search_item("Alain de Botton"); //要查找的作者
pair<multimap<string, string>::iterator, multimap<string, string>::iterator> pos;
for(pos=authors.equal_range(search_item); pos.first != pos.second ; ++pos.first)
cout<<pos.first->second<<endl; //打印每一个题目
}
//一个单词转换的map
//施主。这次能看懂多少看个人造化了^_^。
/*
单词转换文件
brb be right back
k okay?
y why
r are
u you
pic picture
thk thanks!
18r later
我们希望转换的文本
where r u
y dont u send me a pic
k thk 18r
程序输出生成这样:
where are you
why dont you send me a picture
okay? thanks! later
*/
map<string, string> bulidMap(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) //坚持是否有转换规则
{
value=value.substr(1); //跳过前导空格
//插入map
trans_map.insert({key, value});
}
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);
//假设单词在转换规则map中
if(map_it != m.cend())
{
return map_it->second; //使用替换短语
}
else
{
return s; //返回原值
}
}
void word_transform(ifstream &map_file, ifstream &input)
{
auto trans_map=bulidMap(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<<endl<<"-------------------------------------"<<endl;
// cout<<"这个单词是:"<<word<<endl;
// cout<<"-------------------------------------"<<endl;
cout<<transform(word, trans_map); //打印输出
}
cout<<endl; //完毕一行的转换
}
}
int main()
{
ifstream map_file,input;
map_file.open("map_file.txt");
input.open("input.txt");
word_transform(map_file, input);
map_file.close();
input.close();
return 0;
}
这个
bulidMap(ifstream &map_file)
里面的return记得要放到while循环的外面哦
【足迹C++primer】38、关联容器操作(2)的更多相关文章
- 【C++ Primer 第11章】2. 关联容器操作
练习答案 一.访问元素 关联容器额外类型别名 key_type 此容器类型的关键字类型 mapped_type 每个关键字关联的类型,只 适用于map mapped_type 对于set,与key_ ...
- C++ Primer 笔记——关联容器
1.关联容器支持高效的关键字查找和访问,标准库提供8个关联容器. 2.如果一个类型定义了“行为正常”的 < 运算符,则它可以用作关键字类型. 3.为了使用自己定义的类型,在定义multiset时 ...
- c++ primer 10 关联容器
关联容器和顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,顺序容器则通过元素在容器中的位置顺序存储和访问元素 关联容器类型 map 关联数组:元素通过键来存储和读取 set 大小可变的 ...
- 【C++ Primer 第11章 练习答案】2. 关联容器操作
11.3.1节练习 [练习11.16]代码 map<int, int> m; auto iter = m.begin(); iter ->second = ;
- C++ Primer笔记7_STL之关联容器
关联容器 与顺序容器不同,关联容器的元素是按keyword来訪问和保存的.而顺序容器中的元素是按他们在容器中的位置来顺序保存的. 关联容器最常见的是map.set.multimap.multiset ...
- [C++ Primer] : 第11章: 关联容器
目录 使用关联容器 关联容器概述 关联容器操作 无序容器 使用关联容器 关联容器与顺序容器有着根本的不同: 关联容器中的元素是按关键字来保存和访问的, 按顺序容器中的元素是按它们在容器中的位置来顺序保 ...
- C++ 关联容器
<C++ Primer 4th>读书笔记 关联容器和顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素. 关联容器(Ass ...
- 关联容器——map、set
map类型通常被称为关联数组,与正常数组类似,不同之处在于其下标不必是整数.我们通过一个关键字而不是位置来查找值(键值对). 与之相对,set就是关键字的简单集合.当只是想知道一个值是否存在时,set ...
- CH11 关联容器
关联容器与顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的,而顺序容器是按它们在容器中的位置来顺序保存和访问的.两个主要的关联容器:map和set map 中的元素的是一个key-va ...
随机推荐
- 利用table-cell实现元素居中对齐
vertical-align对一些特定显示样式(例如单元格显示方式:table-cell)的元素才会起作用.所以要实现上下垂直居中对齐,可以采用如下样式 display:table-cell; ...
- windbg的使用
1. set 1.1. 设置Symbol file path file->symbol file path, 如: D:\***\TestProject\pdb 1.2 设置source ...
- Http缺省的请求方法是。(选择1项)
A.PUT B.GET C.POST D.TRACE 解答:B
- 整理:java定时器。
本文纯属个人思路,如有错误,请指正. java的Timer依赖Thread,每一个Timer实际上都是一个Thread. import java.util.TimerTask; /** * 本类仅为实 ...
- CSDN日报20170411 ——《怎样给自己的私活项目标价》
[程序人生]怎样给自己的私活项目标价 作者:瞬息之间 非常早之前讲过我们"怎么接私活的心得技巧".相信非常多同学听了心里痒痒的.据我认识的(无论是现实生活还是网上接触的)朋友来看. ...
- Java之线程池
假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间.当T1 + T3 远大于 T2时,采用多线程技术可以显著减少处理器单元的闲置时间,增加处理器 ...
- 【黑金原创教程】【TimeQuest】【第五章】网表质量与外部模型
声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...
- 【黑金原创教程】【Modelsim】【第五章】仿真就是人生
声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...
- 帧动画和骨骼json、极速、二进制对比
对比总结: 1. 帧动画的效率最高,但是图片超过一定帧数,资源图片非常大.比较适合帧数少,大量动画存在,要求效率高的场合. 骨骼json效率较低,已经不推荐使用. 骨骼极速,不支持网格等. 骨骼二进制 ...
- 【BZOJ4864】[BeiJing 2017 Wc]神秘物质 Splay
[BZOJ4864][BeiJing 2017 Wc]神秘物质 Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微 ...