STL初步——映射Map

 

『写在前面的一些基础语法』

1.定义 和 赋值

  • map<int,string>  a;          1.  a.insert(make_pair(233,"a"));        2.  a[2]="b";
  • map<char,int> b;
  • map<int,char> c;
  • 关于两种赋值用法的区别:

¤用insert函数插入数据,在数据的插入上涉及到map关键字的唯一性这个概念。即当map中有这个关键字时,insert操作无效的。

¤用数组方式它可以覆盖以前该关键字对应的值。

(盗一手昆哥的图)

                            

2.Map的特性

  • 所有元素都会根据元素的减值自动被排序。map的所有元素都是pair,同时拥有实值(value)和键值(key)。pair的第一个元素会被视为键值,第二个元素会被视为实值。map不允许两个元素拥有相同的键值
  • 输出

      ¨输出it->first对应的关键字key

¨      输出it->second对应的为其value

3.一些基础的操作(和set完全一致)

所有操作都是根据key来操作改变value,   x  皆为 key

  • a.insert(x) //插入一个元素x,若重则忽略
  • 迭代器(iterator):

      a.end();//返回的迭代器指向最后一个元素的后一个位置;

      a.begin();//¨返回的迭代器指向 map 中的最小key值;

      a.rend;//¨() 返回指向map中第一个元素的反向迭代器;

      a.rbegin();//返回的迭代器指向 map 中的最大key值;

  • a.size();//成员的个数
  • a.empty();//检查map是否为空
  • a.clear();//清空map所有元素
  • a.erase(x);//删除元素x
  • a.find(x);//¨返回 x 元素的迭代器,如果找不到 x 就返回 end() 的 迭代器
  • a.count(x);//统计元素x在map出现的次数(不常用)
  • a.lower_bound(x) //返回 map中大于等于 x 的最小元素的迭代器
  • a.upper_bound(x) //返回 map 中大于 x 的最小元素的迭代器。 如果找不到也会返回 end() 的迭代器

4.又一个双胞胎

¨Multimap:

1.与map不同的是它允许重复键。即一个关键词可以有很多不同的值。这些值按插入的时间顺序排列。

2.没有定义[]运算符,只能利用insert()函数进行插入。

3.¨使用find(x)查找返回每种关键词的所有元素的第一个元素的迭代器。

4.equal_range(x)返回一对iterator的pair,表示关键词x的位置的区间(左闭右开)

『上题上题』

【反片语】(UVa 156)

输入一些单词,找出所有满足如下条件的单词:

该单词不能通过字母重排,得到输入文本中的另外一个单词。

在判断是否满足条件时,不区分大小写,但输出保留输入中的大小写,按字典序进行排列(所有大写字母在小写字母的前面)

【样例输入】

ladder came tape soon leader acme RIDE lone Dreis peat

ScALE orb eye Rides dealer NotE derail LaCeS drIed

noel dire Disk mace Rob dires

#

【样例输出】

Disk
NotE
derail
drIed
eye
ladder
soon

『代码代码』

#include <iostream>
#include <string>
#include <cctype>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

map<string,int> cnt;
vector<string> words;
//将单词 进行"标准化"转化为小写 然后再排序 
string repr(const string s){
	string ans=s;
	for(int i=0;i < ans.length();i++)
		ans[i] = tolower(ans[i]);
	sort(ans.begin(),ans.end());
	return ans;
} 
int main(){
	int n;
	string s;
	while(cin>>s){
		if(s[0] == '#') break;
		words.push_back(s);//将每个单词s压到words中 
		string r = repr(s);//将单词s中字母全"标准化" 
		if(!cnt.count(r)) cnt[r] = 0;//统计单词r的个数 如果该单词不存在  将r存在map中,并将个数初始化为0  
		 cnt[r]++;//统计r出现的次数 
	}
	vector<string> ans;
	for(int i = 0; i <words.size();i++)
		if(cnt[repr(words[i])]==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;
} 
} 

猜你喜欢

转载自blog.csdn.net/sinat_40872274/article/details/81143361