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的函数
/*在一个长度为n的数组里的所有数字都在0到n-1的范围内。
数组中某些数字是重复的,但不知道有几个数字是重复的。
也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
例如,如果输入长度为7的数组{2,3,1,0,2,5,3},
那么对应的输出是重复的数字2或者3。*/
bool duplicate(int numbers[], int length, int* duplication) {
map<int,int> mymap;
map<int,int>::iterator iter;
int i=0;
while(iif(iter==mymap.end())
mymap[numbers[i]]=i;
else{
*duplication=numbers[i];
return true;
}
++i;
}
return false;
}
};
//统计每个单词在输入中出现的次数
map<string, size_t> word_count;
string word;
while(cin>>word)
++word_count[word]; //统计出现的次数
for(const auto &w :word_count)
//打印结果
cout<"occurs"<1) ? "times":"time")<
/*
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
*/
class Solution {
public:
int romanToInt(string s) {
map<char, int> dct;
dct['I'] = 1, dct['i'] = 1;
dct['V'] = 5, dct['v'] = 5;
dct['X'] = 10, dct['x'] = 10;
dct['L'] = 50, dct['l'] = 50;
dct['C'] = 100, dct['c'] = 100;
dct['D'] = 500, dct['d'] = 500;
dct['M'] = 1000, dct['m'] = 1000;
int sum = 0, j;
for(int i = 0; i < s.size(); ++i)
{
j = i+1;
if(j < s.size() && dct[s[j]] > dct[s[i]])
{
sum += dct[s[j]] - dct[s[i]];
i = j;
}
else
sum += dct[s[i]];
}
return sum;
}
};
例如
1. brb—–>be right back
2. k —–>okay?
3. y —–> why
4. r —–> are
5. u —–> you
6. pic —–>pictures
7. thk —–>thanks
8. 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> buildMap (ifstream &map_file){
mapmap<string,string> trans_map;//保存转换规则
string key;//要转换的单词
string value;//替换后的内容
//读取第一个单词存入key中,行中剩余内容存入value中
while(map_file>>key&&getline(map_file,value))
if(value.size()>1)//检查是否有转换规则
trans_map[key]=value.substr(1);//跳过前导空格
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 =map.find(s);
//如果单词在转换规则map中
if(map_it != m.end())
return map_it->second; //使用替换短语
else
return s; //否则返回原短语
}
//单词转换程序
void word_tranform(ifstream &map_file ,ifstream &input){
auto trans_map= buildMap(map_file); //保存转换规则
string line;//保存读入的一行
while(getline(input,line))//读取输入中的每一行
{
istringstream stream(line);
string word;
bool firstword=true;//控制是否打印空格
while(stream>>word)
{
if(firstword)
firstword=false;
else
cout<<" ";//在单词间打印一个空格
cout<//打印输出
}
cout<//完成一行的转换
}
}