版权声明:本文为博主原创文章。未经博主同意不得转载。

https://blog.csdn.net/cutter_point/article/details/35244805

关联容器操作(2)

map的下标操作

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

施主。这次能看懂多少看个人造化了^_^。
单词转换文件。我把它叫做map_file.txt
brb be right back
k okay?
y why
r are
u you
pic picture
thk thanks!
18r later
我们希望转换的文本,这个叫做input.txt
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循环的外面哦
我但是为了这个吃了不少苦头。
PS:放假了。我预计最多把今天写完了,明天開始大概要停更了。大家不要停止学习哦。一起加油,一起努力。这本书我还是会看下去的,仅仅是博客可能更不了了。

【足迹C++primer】38、关联容器操作(2)的更多相关文章

  1. 【C++ Primer 第11章】2. 关联容器操作

    练习答案 一.访问元素 关联容器额外类型别名  key_type 此容器类型的关键字类型 mapped_type 每个关键字关联的类型,只 适用于map mapped_type 对于set,与key_ ...

  2. C++ Primer 笔记——关联容器

    1.关联容器支持高效的关键字查找和访问,标准库提供8个关联容器. 2.如果一个类型定义了“行为正常”的 < 运算符,则它可以用作关键字类型. 3.为了使用自己定义的类型,在定义multiset时 ...

  3. c++ primer 10 关联容器

    关联容器和顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,顺序容器则通过元素在容器中的位置顺序存储和访问元素 关联容器类型 map 关联数组:元素通过键来存储和读取 set 大小可变的 ...

  4. 【C++ Primer 第11章 练习答案】2. 关联容器操作

    11.3.1节练习 [练习11.16]代码 map<int, int> m; auto iter = m.begin(); iter ->second = ;

  5. C++ Primer笔记7_STL之关联容器

    关联容器 与顺序容器不同,关联容器的元素是按keyword来訪问和保存的.而顺序容器中的元素是按他们在容器中的位置来顺序保存的. 关联容器最常见的是map.set.multimap.multiset ...

  6. [C++ Primer] : 第11章: 关联容器

    目录 使用关联容器 关联容器概述 关联容器操作 无序容器 使用关联容器 关联容器与顺序容器有着根本的不同: 关联容器中的元素是按关键字来保存和访问的, 按顺序容器中的元素是按它们在容器中的位置来顺序保 ...

  7. C++ 关联容器

    <C++ Primer 4th>读书笔记 关联容器和顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素. 关联容器(Ass ...

  8. 关联容器——map、set

    map类型通常被称为关联数组,与正常数组类似,不同之处在于其下标不必是整数.我们通过一个关键字而不是位置来查找值(键值对). 与之相对,set就是关键字的简单集合.当只是想知道一个值是否存在时,set ...

  9. CH11 关联容器

    关联容器与顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的,而顺序容器是按它们在容器中的位置来顺序保存和访问的.两个主要的关联容器:map和set map 中的元素的是一个key-va ...

随机推荐

  1. ngx_lua模块学习示例之waf

    转自:http://www.tuicool.com/articles/FbQ3ymB WAF的主要功能为: ip黑白名单 url黑白名单 useragent黑白名单 referer黑白名单 常见web ...

  2. 关于Unity的坐标系

    1.坐标系分为左手坐标系和右手坐标系 2.用手从X轴旋到Y轴画一个弧,如果大拇指所指的方向是Z轴,那么这个坐标系就是这只手的坐标系 3.Unity是左手坐标系,OpenGl是右手坐标系 Unity坐标 ...

  3. MyBatis 使用简单的 XML或注解用于配置和原始映射

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .My ...

  4. POJ 3181 Dollar Dayz 01全然背包问题

    01全然背包问题. 主要是求有多少种组合.二维dp做的人多了,这里使用一维dp就能够了. 一维的转换方程:dp[j] = dp[j-i] + dp[j];当中i代表重量,j代表当前背包容量. 意思就是 ...

  5. wifi的web 认证。

    wifi的web 认证.wifidog+authpuppy+php 或者Wiwiz Auth API

  6. HDU 1284 钱币兑换问题(全然背包:入门题)

    HDU 1284 钱币兑换问题(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1284 题意: 在一个国家仅有1分,2分.3分硬币,将钱N ( ...

  7. unity导弹算法 预计目标点

    关于导弹的飞行算法,网上有很多教程.简单算法无非是获取目标点的当前位置,然后导弹朝目标方向移动.高深点的,就是通过计算获取碰撞点然后朝着目标移动.如果你能看懂这个高深算法的话,可以去看原帖:http: ...

  8. 怎么用ChemDraw加反应条件

    众所周知大部分化学反应都需要在一定的条件下才会发生,比较常见的条件有压力.通电.温度.光照等等.这些特定条件在化学上就叫反应条件.我们在使用ChemDraw这款化学绘图软件的时候,往往需要给我们的化学 ...

  9. Docker 使用及常用命令

    https://yeasy.gitbooks.io/docker_practice/content/image/dockerfile/expose.html docker practice 资料 -- ...

  10. 我使用过的Linux命令之sftp - 安全文件传输命令行工具

    用途说明 sftp命令可以通过ssh来上传和下载文件,是常用的文件传输工具,它的使用方式与ftp类似,但它使用ssh作为底层传输协议,所以安全性比ftp要好得多. 常用方式 格式:sftp <h ...