map

operator<的重载一定要定义成const。因为map内部实现时调用operator<的函数好像是const。

#include<string>
#include<iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include<map>

using namespace std;

struct person
{
    string name;
    int age;

    person(string name, int age)
    {
        this->name =  name;
        this->age = age;
    }

    bool operator < (const person& p) const
    {
        return this->age < p.age;
    }
};

map<person,int> m;
int main()
{
    person p1();
    person p2();
    person p3();
    person p4();
    person p5();
    m.insert(pair<person, ));
    m.insert(pair<person, ));
    m.insert(make_pair(p5, ));
    m.insert(make_pair(p1, ));

    m[p2] = ;

    for(map<person, int>::iterator iter = m.begin(); iter != m.end(); iter++)
    {
        cout<<iter->first.name<<"\t"<<iter->first.age<<endl;
    }

    getchar();
    ;
}

unordered_map

哈希map使用上和map区别不大,差别主要在性能上。

map采用红黑树的方式,而hash_map采用哈希的方法,

插入::   所以map的插入和删除速率要比hash_map高,hash_map要做冲突处理。

查找::   但是查找上hash_map就要比map的性能高很多,因为是哈希,所以可以直接按照内容找到,即查找的复杂度是O(1)。

#include<string> #include<iostream>#include<unordered_map>
#include <algorithm>
using namespace std;

void myfunc( const pair< int, int >& obj)
{
std::cout << "first=" << obj.first << "second=" << obj.second <<std::endl;
}

unordered_map<int,int> m;
int main()
{
m.insert(pair<, ));
m.insert(pair<, ));
m.insert(make_pair(, ));
m.insert(make_pair(, )); 

m[] = ;

for(auto iter = m.begin(); iter != m.end(); iter++)
{
cout<<iter->first<<"\t"<<iter->second<<endl;
}

for_each(m.begin(), m.end(), myfunc);

getchar();
;
}
增  insert     数组方式object[key_value] = value;
创建map的成员::
方法一、插入value_type         
map<int,string>::value_type   value(1,"billchen");
object.insert(value);
也可以用   value.insert(map<int,string>::value_type(1,"billchen"));作用是一样的。  
方法二、插入pair或make_pair数据
map<int,string>   object;
object.insert(pair<int,string>(1,"billchen"));
或者
object.insert(make_pair(1,"billchen"));                   
/*
      其中pair是一个模板pair<T1,T2>  pvalue(v1,v2);表示创建一个pair对象,
       v1和v2的类型是T1和T2,值是v1和v2。
       可以取出v1和v2的值,
        分别是pvalue.first  为  v1
        pvalue.second   为   v2
*/
/*
        其中make_pair(v1,v2);表示以v1,v2创建一个新的pair对象,类型是v1和v2的类型。
         一般用在map的insert方法中,创建临时对象。
*/
 
insert有可能因为主键冲突,插入不了,可以通过返回值判断:
std::pair<std::tr1::unordered_map<std::string, std::string>::iterator,bool> ret  =                       ssmap.insert(std::make_pair("cccc","ccccc1"));
if(ret.second){
       std::cout << "insert succ" << std::endl;
}   
else{
       std::cout << "insert failed" << std::endl;
}   
方法三、数组方式
map<int,string>    object;
object[1]="billchen";         //object[key_value]=value;               (在key值对应的空间填写数据)
 
删除map中的一个元素,使用erase
方法一、通过迭代器删除         
map<int,string>::iterator   iter = object.find(key);                    
if(iter != object.end())
{
      object.erase(iter);                        
}
方法二、通过key值删除
object.erase(key);                   //删除成功,返回1,删除失败,返回0
删除map中的一段,如迭代器iter_begin到iter_end的元素:
iter_begin = object.find(key_value1);
iter_end = object.find(key_value2);
if(iter_begin != object.end() && iter_end != object.end())
{
      object.erase(iter_begin,iter_end);
}

删除所有元素使用erase:

方法一、使用迭代器,遍历删除         
map<int,string>::iterator iter=object.begin();
while(iter!=object.end())
{
        object.erase(iter++);    //这样做,是为了防止迭代器失效。
}
方法二、调用clear接口
object.clear();
                                           
修改map中成员的值(迭代器):
map<int,string>::iterator   iter = object.find(key);
iter->second="wang";
修改map中成员的值(数组方式):
map[key] = "wang";
例如:
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main(int argc,char *argv[])
{
        int i;
        map<char,string> obj;
        map<char,string>::value_type mem1('a',"billchen");
        obj.insert(mem1);
        map<char,string>::iterator iter = obj.begin();
        while(iter != obj.end())        //修改
        {   
                iter->second="wang";
                iter++;
        }   
        iter=obj.begin();
        while(iter != obj.end())        //遍历
        {   
                cout << iter->first << endl;
                cout << iter->second << endl;
                iter++;
        }   
        return 0;
}
 
查   find
查找使用find(主键);
object.find(主键);
返回值为iterator(迭代器),
if(object.find(主键) == object.end())
{
       cout << "没有找到" <<endl;
}
 
遍历
遍历方法1:    通过迭代器
map<int,string>::iterator iter=object.begin();

while(iter!=object.end())
{
       cout<<iter->first<<iter->second等等<<endl;
       iter++;
}
适当的情况下,可以使用数组的方式来进行map的遍历。
 
获取map中成员的个数  size()
获取map中元素的个数:
map<int,string> obj;
map<int,string>::value_type mem1(1,"billchen");
map<int,string>::value_type mem2(2,"chenbaihu");
obj.insert(mem1);
obj.insert(mem2);
cout << obj.size() <<endl;
 
判断map是否为空,使用empty                                                 
为空,返回true,不为空,返回false;

c++ map unordered_map的更多相关文章

  1. STL——map/unordered_map基础用法

    map /multimap map是STL里重要容器之一. 它的特性总结来讲就是:所有元素都会根据元素的键值key自动排序(也可根据自定义的仿函数进行自定义排序),其中的每个元素都是<key,  ...

  2. hash_map,map,unordered_map效率

    利用unordered_map代替hash_map 实验环境 操作系统 fedora9 编译器版本 gcc4.3 实验方式 各种map使用插入和查找,比较速度和相关性能 代码 参考代码 下面测试说明了 ...

  3. map和unordered_map的差别和使用

    map和unordered_map的差别还不知道或者搞不清unordered_map和map是什么的,请见:http://blog.csdn.net/billcyj/article/details/7 ...

  4. 【转】Map 与 Unordered_map

    map和unordered_map的差别和使用 map和unordered_map的差别还不知道或者搞不清unordered_map和map是什么的,请见:http://blog.csdn.net/b ...

  5. C++ map与unordered_map

    map与unordered_map对比 map unordered_map 红黑树(非严格二叉平衡搜索树)实现 哈希表实现 有序 无序 -- 查找时间复杂度为O(1),非常快 空间消耗较大 空间消耗较 ...

  6. 原 c++中map与unordered_map的区别

    c++中map与unordered_map的区别 头文件 map: #include < map > unordered_map: #include < unordered_map ...

  7. STL之map与pair与unordered_map常用函数详解

    STL之map与pair与unordered_map常用函数详解 一.map的概述 map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称 ...

  8. 关于c++ STL map 和 unordered_map 的效率的对比测试

    本文采用在随机读取和插入的情况下测试map和unordered_map的效率 笔者的电脑是台渣机,现给出配置信息 处理器 : Intel Pentium(R) CPU G850 @ 2.90GHz × ...

  9. [C++]-map和unordered_map

    转自:https://blog.csdn.net/BillCYJ/article/details/78985895 头文件不同 map: #include < map > unordere ...

随机推荐

  1. html5权威指南:表单元素

    一.表单标签: 表单标签:http://blog.csdn.net/mylovestart/article/details/8589002 html5新增表单元素: 1.datalist:http:/ ...

  2. hdfs zkfc –formatZK 之HadoopIllegalArgumentException: Bad argument: –formatZK

    HadoopIllegalArgumentException: Bad argument: –formatZK从某文档中拷贝的命令,粘贴过来使用的,“–formatZK”有问题解决方法:手工输入此命令 ...

  3. 【Python】关于Python有意思的用法

    开一篇文章,记录关于Python有意思的用法,不断更新 1.Python树的遍历 def sum(t): tmp=0 for k in t: if not isinstance(k,list): tm ...

  4. 【LeetCode】423. Reconstruct Original Digits from English

    Given a non-empty string containing an out-of-order English representation of digits 0-9, output the ...

  5. 5、Struts2自定义拦截器

    一.拦截器相关知识 1.Struts2框架剖析 Holly版本生活案例: 影视公司(拍电影)    ActionMapper 传媒公司(包装明星) ActionMapping 明星           ...

  6. HDU 1242 Rescue(BFS),ZOJ 1649

    题目链接 ZOJ链接 Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The ...

  7. CodeForces 697B Barnicle 模拟

    强行模拟 纪念一下…… #include<stdio.h> #include<iostream> #include<algorithm> #include<m ...

  8. IntelliJ IDEA 13.1.4新建java web项目

    打开软件

  9. sql分页比较简单快捷的方法

    SELECT TOP 显示数量* FROM 表 WHERE (主键id>(SELECT MAX(主键id) FROM(SELECT TOP 页码数*显示数量 主键id FROM 表 ORDER ...

  10. 【Office Web Apps】在 SharePoint 中使用 Office Web Apps

    在 SharePoint 中使用 Office Web Apps 在安装并配置了 Microsoft Office Web Apps 的 SharePoint 网站上,通过 Office Web Ap ...