您的位置:首页 > 编程语言 > C语言/C++

C++学习笔记--STL(映射:map)

2016-03-02 20:39 471 查看
一、map就是从键(key)到值(value)的映射。

二、关于map的方法

begin() – 返回指向map头部的迭代器

clear() –删除所有元素

count() –返回指定元素出现的次数

empty() –如果map为空则返回true

end() –返回指向map末尾的迭代器

equal_range() –返回特殊条目的迭代器对

erase() –删除一个元素

find() –查找一个元素

get_allocator() –返回map的配置器

insert() –插入元素

key_comp() –返回比较元素key的函数

lower_bound() –返回键值>=给定元素的第一个位置

max_size() –返回可以容纳的最大元素个数

rbegin() –返回一个指向map尾部的逆向迭代器

rend() –返回一个指向map头部的逆向迭代器

size() –返回map中元素的个数

swap() –交换两个map

upper_bound() –返回键值>给定元素的第一个位置

value_comp() –返回比较元素value的函数

三、map的应用

  一道竞赛题目:输入一些单词,以#表示输入结束,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本中的另外一个单词。在判断是否满足条件时,字母不区分大小写,但在输出时应保留输入中的大小写,按字典序进行排序(所有大写字母在所有小写字母的前面)。

  代码设计分析:把每个单词“标准化”,即将每个单词全部转化为小写字母后再进行排序,然后再放到map中进行统计。

  解答代码:

#include <iostream>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
//#include <ctype.h>   查阅API时,发现tolower()是需要这个头文件的,但在用dev运行时,发现不用这个头文件也可通过编译
using namespace std;

map<string, int> cnt;  //以标准化后的单词为key, 以key的个数作为key的值
vector<string> words;  //保存输入的单词

string repr(const string& s){//将单词标准化,即将单词全部转为小写字母后,再进行排序
string ans = s;
for(int i=0; i<ans.length(); i++){
ans[i] = tolower(ans[i]);  //将第i个字母转化为小写字母
}
sort(ans.begin(), ans.end());  //对字母排序
return ans;
}

int main(){
int n =0;
string s;
while(cin>>s){  //输入字符窜,当输入#时,表示输入结束
if(s[0]=='#') break;
words.push_back(s);  //将输入的单词放进数组words中
string r=repr(s);  //将单词标准化

//count()函数返回map中键值等于key的元素的个数。
if(!cnt.count(r)) cnt[r] = 0;  //如果映射cnt数组中不存在这个标准化单词,则给这个key的值设为0
cnt[r] ++;  //key的值加1
}
vector<string> ans; //用此函数来保存满足要求的单词
for(int i=0; i<words.size(); i++){  //循环输入并保存在words中的单词
if(cnt[repr(words[i])] ==1 ) {  //如果这个单词标准化后,作为cnt的key,看对应的值是否为1,如果为1,则说明该单词不能通过字母重排得到文本中的另外一个单词
ans.push_back(words[i]);  // 将符合要求的单词放进ans中
}
}
sort(ans.begin(), ans.end());  //对数组中的单词进行排序
for(int i=0; i<ans.size(); i++){
cout<<ans[i]<<"\n";  //输出排序结果
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: