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. I’m stuck!

    I’m stuck! 问题描述 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思: '#': 任何时候 ...

  2. java中的日期处理

    学习Java日期处理,看见这一篇比较详细,转载之. 转自:http://www.cnblogs.com/hqr9313/archive/2012/04/19/2458221.html   时间日期1) ...

  3. HDU_1245_Saving James Bond_最短路

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1245 题意:给一个已知直径的圆形岛,然后岛的附近是湖,湖里有一些点,以坐标的形式给出,最外层是矩形的终 ...

  4. 2.Math对象

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. Docker私有仓库3

    http://www.cnblogs.com/womars/p/5906435.html(上篇地址) 三.测试上两篇 #测试一下 [root@lh- data]# pwd /opt/data [roo ...

  6. [ An Ac a Day ^_^ ] [kuangbin带你飞]专题四 最短路练习 POJ 3259 Wormholes

    SPFA求负环 模板题 记得每组处理之前clear vector /* *********************************************** Author :Sun Yuef ...

  7. FZU 1920 Left Mouse Button 简单搜索

    题意就是扫雷 问最少多少次可以把图点开…… 思路也很明显 就是先把所有的标记一遍 就当所有的都要点…… 录入图…… 所有雷都不标记…… 之后呢 遍历图…… 然后碰到0就搜索一圈 碰到数字就标记…… 不 ...

  8. 如何将编译出来的images拷贝到windows下面刷机

    由于SPRD的刷机工具ResearchDownload运行在window环境下:这样,我们平时在开发环境下编译出来的镜像文件就不能直接用于刷机了. 这里涉及到一个双系统中文件共享的方法.由于企业信息安 ...

  9. G - Zombie’s Treasure Chest(动态规划专项)

    G - Zombie’s Treasure Chest Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d &am ...

  10. photoshop的页面制作练习1