map–C++ STL 学习

  Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力。

  说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的

map是使用红黑树实现的,访问、查找和删除操作的复杂度都是O(logn)。

template<
class Key, //键
class T, //值
class Compare = std::less<Key>, //
class Allocator = std::allocator<std::pair<const Key, T>
> class map;

(1)map的创建

map共提供了6个构造函数,这块涉及到内存分配器这些东西,略过不表,在下面我们将接触到一些map的构造方法,这里要说下的就是,我们通常用如下方法构造一个map:

Map<int, string> mapStudent;

(2)遍历操作

遍历map无疑就需要使用到迭代器,下面列出了四种map迭代器

iterator begin();   //返回指向起始元素的迭代器
iterator rbegin(); //返回指向末尾元素的迭代器 iterator end(); //返回指向末尾元素的后一个的迭代器
iterator rend(); //返回指向起始元素的前一个的迭代器

(3)插入操作

1.使用[]插入

直接使用[]插入,如果mymap中不存在键值为”abc”元素,那么就执行插入操作。

mymap["abc"] = 1;

2.插入单个元素

//函数原型:
std::pair<iterator,bool> insert( const value_type& value ); //这里的返回值:bool表示插入是否成功、iterator返回插入的位置
//操作示例:
mymap.insert( map<int, string>::value_type(1, "one") );

3.插入多个元素

//函数原型:
template< class InputIt >
void insert( InputIt first, InputIt last );
//操作示例:
map<int, string> tmp = {
{5, "five"},
{6, "six"}
};
mymap.insert( tmp.begin(),tmp.end() );

4. 使用std::initializer_list插入

C++11中新加入的插入数据方式:

//函数原型:
void insert( std::initializer_list<value_type> ilist );
//操作示例:
mymap.insert( { {7, "seven"}, {8, "eight"}, {9, "nine"} } );

(4)删除操作

1. 删除指定位置的元素

//函数原型:
iterator erase( iterator pos );
//具体示例:
std::map<std::string,int>::iterator it = mymap.erase(mymap.begin()); //返回删除元素的下一个元素的迭代器

2. 删除指定范围的元素

//函数原型:
iterator erase( const_iterator first, const_iterator last );
//具体示例:
mymap.erase(mymap.begin(), mymap.end()); //删除所有的元素

3. 依据键值删除元素

//函数原型:
size_type erase( const key_type& key );
//具体示例:
int num = mymap.erase("abc");

PS:方法一和方法二的返回值都是删除元素的下一个元素的迭代器,在C++11之前他们都是没有返回值的。方法三的返回值是删除元素的数目。

(5)max_size(),最大容纳量;size(),当前的元素个数

cout << "map中的最大容量为:" << map1.max_size() << endl;
cout << "map中的元素个数为:" << map1.size() << endl;

(6)empty(),判断map是否为空

cout << "map是否为空:" << map1.empty() << endl;

如果为空,返回1.否则返回0。

(7)swap():交换两个map中的值。

(8)[],at(),取某位置的元素值

// 取map中某位置的元素值
cout << "在1位置的元素值为:" << map1.at(1) << endl;
cout << "在1位置的元素值为:" << map1[1] << endl;

(9)[],at():修改元素

// 修改map中的某个值
map1[2] = 99; map1.at(3) = 88;

(10)clear():清除所有元素

// 清除所有数据
map1.clear();
cout << "map是否为空:" << map1.empty() << endl;

执行以后就是一个空的map,不包含任何元素。

其他方法

size_type count( const Key& key ) const; //返回关键字为key的元素的个数,在map里结果不是0就是1
iterator find( const Key& key ); //返回key所在位置的迭代器,如果没有找到则返回end()

关于map的更详细介绍可以参考文档:http://en.cppreference.com/w/cpp/container/map

map--C++ STL 学习的更多相关文章

  1. STL学习:STL库vector、string、set、map用法

    本文仅介绍了如何使用它们常用的方法. vector 1.可随机访问,可在尾部插入元素:2.内存自动管理:3.头文件#include <vector> 1.创建vector对象 一维: (1 ...

  2. 侯捷STL学习(九)--关联式容器(Rb_tree,set,map)

    layout: post title: 侯捷STL学习(九) date: 2017-07-21 tag: 侯捷STL --- 第十九节 容器rb_tree Red-Black tree是自平衡二叉搜索 ...

  3. 侯捷STL学习(十)--容器hashtable探索(unordered set/map)

    layout: post title: 侯捷STL学习(十) date: 2017-07-23 tag: 侯捷STL --- 第二十三节 容器hashtable探索 hashtable冲突(碰撞)处理 ...

  4. 标准模板库(STL)学习指南之map映射

    转载自CSDN博客:http://blog.csdn.net/bat603/article/details/1456141 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关 ...

  5. 标准模板库(STL)学习探究之stack

    标准模板库(STL)学习探究之stack queue priority_queue list map/multimap dequeue string

  6. ###STL学习--vector

    点击查看Evernote原文. #@author: gr #@date: 2014-08-11 #@email: forgerui@gmail.com vector的相关问题.<stl学习> ...

  7. ###STL学习--关联容器

    点击查看Evernote原文. #@author: gr #@date: 2014-08-23 #@email: forgerui@gmail.com STL中的关联容器. ###stl学习 |--迭 ...

  8. ###STL学习--迭代器

    点击查看Evernote原文. #@author: gr #@date: 2014-08-23 #@email: forgerui@gmail.com STL中的迭代器. ###stl学习 |--迭代 ...

  9. ###STL学习--函数对象

    点击查看Evernote原文. #@author: gr #@date: 2014-08-13 #@email: forgerui@gmail.com 在stl中,函数对象被大量地使用,用以提高代码的 ...

随机推荐

  1. HDU 3032 Nim or not Nim?(博弈,SG打表找规律)

    Nim or not Nim? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  2. 请用心练完这16个webpack小例子

    16个demo,webpack+react搭配使用首先教大家2个新技能 1.按照正常github地址情况下,你的github本身不能访问目录. 例如要访问vue-demo下的vueCpu文件夹:htt ...

  3. jquery修改ajax的header的字段origin方法,均被浏览器拒绝

    一.方法一 $.ajax({ headers: { Origin: "http://targetIP" } }); 二.方法二 $.ajax({ beforeSend: funct ...

  4. GyoiThon:基于机器学习的渗透测试工具

    简介 GyoiThon是一款基于机器学习的渗透测试工具. GyoiThon根据学习数据识别安装在Web服务器上的软件(操作系统,中间件,框架,CMS等).之后,GyoiThon为已识别的软件执行有效的 ...

  5. http://zhidao.baidu.com/link?url=inouJq69pK4PVM2L26fvnxXfRKhJ1uKmttgVqIEqld14SEUa8JzXZfRYHS3qdltqMXBgEQycFsF8AI9DlSoH4_

    http://zhidao.baidu.com/link?url=inouJq69pK4PVM2L26fvnxXfRKhJ1uKmttgVqIEqld14SEUa8JzXZfRYHS3qdltqMXB ...

  6. Java调用Oracle存储过程

    package com.hp.test; import java.sql.CallableStatement; import java.sql.Connection; import java.sql. ...

  7. 虚拟机主流软件Vmware安装

    虚拟机主流软件vmware 官网:http://www.vmware.com Vmware8比较常用的稳定老版本 特点:1)不需要重新分区,只要有硬盘容量 2)模拟的操作系统可以和真正的电脑一样,可以 ...

  8. Spring MVC防止数据重复提交(防止二次提交)

    SpringMvc使用Token 使用token的逻辑是,给所有的url加一个拦截器,在拦截器里面用java的UUID生成一个随机的UUID并把这个UUID放到session里面,然后在浏览器做数据提 ...

  9. wine 魔兽争霸

    连接参见http://linux-wiki.cn/wiki/%E7%94%A8Wine%E8%BF%90%E8%A1%8C%E9%AD%94%E5%85%BD%E4%BA%89%E9%9C%B8III ...

  10. LInux——安装Apache

    在安装Apache的httpd的时候经常会遇到: configure: error: APR not found .  Please read the documentation. configure ...