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. Chapter 2 Open Book——25

    "My name is Edward Cullen," he continued. "I didn't have a chance to introduce myself ...

  2. Java Lambda表达式入门[转]

    原文链接: Start Using Java Lambda Expressions http://blog.csdn.net/renfufei/article/details/24600507 下载示 ...

  3. 浙大 pat 1007题解

    Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to be { Ni, ...

  4. React - Stores

    Event emmiters that make data available, handle business logic, send events to React, and listen for ...

  5. C程序浅议

    文件FILE是程序设计中的一个重要概念.所谓“文件”一般是指存储在外部介质上的数据的集合.操作系统是以文件为单位对数据进行管理的,而文件是以文件名为标识的.操作系统对文件实行“按名存取”. C语言把文 ...

  6. LeetCode OJ 169. Majority Element

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  7. CodeForces 697B Barnicle 模拟

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

  8. 解决XCode插件在XCode6.4上失效的办法

    Xcode 6.4  解决 插件失效的方法 查看 插件目录: ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/ 邮件打开插件 ...

  9. HttpClient模拟get,post请求并发送请求参数(json等)

    import java.io.IOException; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org. ...

  10. Spring测试

    测试类添加两个注解 @RunWith(SpringJUnit4ClassRunner.class)和@ContextConfiguration(locations = "classpath: ...