映射:map专题

Posted aiahtwo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了映射:map专题相关的知识,希望对你有一定的参考价值。

 

概念:摘自《算法竞赛入门经典》——刘汝佳:map就是从键(key)到值(value)的映射。因为重载了[]运算符,map像是数组的“高级版”。

例如可以用一个map<string, int> month_name 来表示“月份名字到月份编号”的映射然后用month_name["July"] = 7 这样的方式来赋值。

Map中的元素是自动按key升序排序,所以不能对map用sort函数:

map的功能: 

1. 自动建立Key - value的对应。key 和 value可以是任意你需要的类型。
2. 根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。
3. 快速插入Key - Value 记录。
4. 快速删除记录
5. 根据Key 修改value记录。
6. 遍历所有记录。

map多用于查找很方便快捷,尤其是以键和值的形式存在的。在大量数据中使用map,查询效率很高。 

举例:

map<int, string> student;
student.insert(pair<int, string>(54090101, "Mike"));
student.insert(pair<int, string>(54090102, "MIKE"));
student.insert(map<int, string>::value_type(54090103, "Sam"));
student.insert(map<int, string>::value_type(54090104, "SAM"));
student[54090105] = "Jake";
student[54090105] = "JAKE";//键值为标识,重复插入,结果为替换
studentMessage[54090104] = "Bob";
studentMessage[54090105] = "Ben";

遍历
map<int, string>::iterator iter;
for (iter = student.begin(); iter != student.end(); ++iter)
{
cout << iter->first << ": " << iter->second << endl;
}

C++ map的基本操作和使用:

http://blog.sina.com.cn/s/blog_61533c9b0100fa7w.html

例题uva 156

 

技术图片
#include<iostream>
#include<string>
#include<cctype>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;

map<string,int> cnt;
vector<string>words;

//将单词s进行标准化   即全为小数且字符都是排序的 
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=0;
    string s;
    while(cin>>s)
    {
        if(s[0]==#)
        break;
        words.push_back(s);//向vector数据结构中添加元素 
        string r=repr(s);
        //开始map里面没有内容,它的初始化值是:{},即里边有0个键值对 
        if(cnt.count(r)==0)   //检验被查找的r是否存在,存在返回1,否则为0 
        cnt[r]=0;
        cnt[r]++;//记录每个字符串s搜查之后为s1,统计各个s1的键值 
    } 
    vector<string> ans;
    for(int i=0;i<words.size();i++)
    if(cnt[repr(words[i])]==1)//说明重排也无重复字符串 
    ans.push_back(words[i]);//向vector数据结构中添加元素 
    sort(ans.begin(),ans.end());//按顺序排序 
    for(int i=0;i<ans.size();i++)
    cout<<ans[i]<<"
";
    return 0;
 } 
View Code

 

运用:vector数组和map映射

首先是字符串用到的函数:

string s;   

string hansu(const string& str)   { return str;}   //字符串为返回值的方法

int len=s.length(); //计算字符串长度    s[i]=tolower(s[i])  //单个字符变成小写字符  sort(s.begin(),s.end());//对字符串的字符进行字符排序

然后vector数组用到的函数:

vector<string>words;

words.push_back(s);    / /向vector数据结构中添加元素 

sort(words.begin(),words.end());//给数组升序排序

words.size();//该数组元素个数

最后map映射用到的函数:

map<string,int> cnt; 

cnt.count(r)//检验被查找的r是否存在,存在返回1,否则为0 

cnt[r]=0;//赋值   等效为map[string]=int    在这为string出现的次数

 



















以上是关于映射:map专题的主要内容,如果未能解决你的问题,请参考以下文章

替换为范围和哈希映射

Python代码阅读(第26篇):将列表映射成字典

SSMMyBatis(九.查询语句专题)

JVM技术专题 带你梳理分析虚拟机栈映射源代码的流程「原理篇」

如何使用webpack加载库源映射?

CSP核心代码片段记录