C++ std::map
std::map
template < class Key, // map::key_type
class T, // map::mapped_type
class Compare = less<Key>, // map::key_compare
class Alloc = allocator<pair<const Key,T> > // map::allocator_type
> class map;
Map
Maps are associative containers that store elements formed by a combination of a key value and a mapped value, following a specific order.
In a map, the key values are generally used to sort and uniquely identify the elements, while the mapped values store the content associated to this key. The types of key and mapped value may differ, and are grouped together in member type value_type, which is a pair type combining both:
typedef pair<const Key, T> value_type;
Internally, the elements in a map are always sorted by its key following a specific strict weak ordering criterion indicated by its internal comparison object (of type Compare).
map containers are generally slower than unordered_map containers to access individual elements by their key, but they allow the direct iteration on subsets based on their order.
The mapped values in a map can be accessed directly by their corresponding key using the bracket(方括号) operator ((operator[]).
Maps are typically implemented as binary search trees(二叉搜索树).
Container properties
- Associative: Elements in associative containers are referenced by their key and not by their absolute position in the container.
- Ordered: The elements in the container follow a strict order at all times. All inserted elements are given a position in this order.
- Map: Each element associates a key to a mapped value: Keys are meant to identify the elements whose main content is the mapped value.
- Unique keys: No two elements in the container can have equivalent keys.
- Allocator-aware: The container uses an allocator object to dynamically handle its storage needs.
Template parameters
- Key: Type of the keys. Each element in a map is uniquely identified by its key value. Aliased as member type map::key_type.
- T: Type of the mapped value. Each element in a map stores some data as its mapped value. Aliased as member type map::mapped_type.
- Compare: A binary predicate(二元谓词) that takes two element keys as arguments and returns a bool. The expression comp(a,b), where comp is an object of this type and a and b are key values, shall return true if a is considered to go before b in the strict weak ordering the function defines. The map object uses this expression to determine both the order the elements follow in the container and whether two element keys are equivalent (by comparing them reflexively: they are equivalent if !comp(a,b) && !comp(b,a)). No two elements in a map container can have equivalent keys. This can be a function pointer or a function object (see constructor for an example). This defaults to less, which returns the same as applying the less-than operator (a<b). Aliased as member type map::key_compare.
- Alloc: Type of the allocator object used to define the storage allocation model. By default, the allocator class template is used, which defines the simplest memory allocation model and is value-independent. Aliased as member type map::allocator_type.
Member types
| member type | definition | notes |
|---|---|---|
| key_type | The first template parameter (Key) | |
| mapped_type | The second template parameter (T) | |
| value_type | pair<const key_type,mapped_type> | |
| key_compare | The third template parameter (Compare) | defaults to: less<key_type> |
| value_compare | Nested function class to compare elements | see value_comp |
| allocator_type | The fourth template parameter (Alloc) | defaults to: allocator<value_type> |
| reference | value_type& | |
| const_reference | const value_type& | |
| pointer | allocator_traits<allocator_type>::pointer | for the default allocator: value_type* |
| const_pointer | allocator_traits<allocator_type>::const_pointer | for the default allocator: const value_type* |
| iterator | a bidirectional iterator to value_type | convertible to const_iterator |
| const_iterator | a bidirectional iterator to const value_type | |
| reverse_iterator | reverse_iterator | |
| const_reverse_iterator | reverse_iterator<const_iterator> | |
| difference_type | a signed integral type, identical to: | |
| iterator_traits::difference_type | usually the same as ptrdiff_t | |
| size_type | an unsigned integral type that can represent any non-negative value of difference_type | usually the same as size_t |
Member functions
- (constructor) Construct map (public member function )
- (destructor) Map destructor (public member function )
- operator= Copy container content (public member function )
Iterators:
- begin: Return iterator to beginning (public member function )
- end: Return iterator to end (public member function )
- rbegin: Return reverse iterator to reverse beginning (public member function )
- rend: Return reverse iterator to reverse end (public member function )
- cbegin: Return const_iterator to beginning (public member function )
- cend: Return const_iterator to end (public member function )
- crbegin: Return const_reverse_iterator to reverse beginning (public member function )
- crend: Return const_reverse_iterator to reverse end (public member function )
Capacity:
- empty: Test whether container is empty (public member function )
- size: Return container size (public member function )
- max_size: Return maximum size (public member function )
Element access:
- operator[]: Access element (public member function )
- at: Access element (public member function )
Modifiers:
- insert: Insert elements (public member function )
- erase: Erase elements (public member function )
- swap: Swap content (public member function )
- clear: Clear content (public member function )
- emplace: Construct and insert element (public member function )
- emplace_hint: Construct and insert element with hint (public member function )
Observers(观察者):
- key_comp: Return key comparison object (public member function )
- value_comp: Return value comparison object (public member function )
Operations:
- find: Get iterator to element (public member function )
- count: Count elements with a specific key (public member function )
- upper_bound: Return iterator to upper bound (public member function )
- lower_bound: Return iterator to lower bound (public member function )
- equal_range: Get range of equal elements (public member function )
Allocator:
- get_allocator: Get allocator (public member function )
Code Example
#include <iostream>
#include <map>
using namespace std;
bool fncomp( char lhs, char rhs )
{ return lhs < rhs; }
struct classcomp{
bool operator() (const char& lhs, const char& rhs)
{ return lhs < rhs; }
};
int main(int argc, char **argv)
{
map<char,int> first1;
first1['a'] = 10; first1['b'] = 20;
first1['c'] = 30; first1['d'] = 40;
map<char,int> first2( first1.begin(),first1.end() );
map<char,int> first3( first2 );
map<char,int, classcomp> first4; ///< class as Compare
/** function pointer as Compare */
bool(*fn_pt)(char,char) = fncomp;
map<char,int,bool(*)(char,char)> first5(fn_pt);
map<char,int> second;
second.emplace('x', 100);
second.emplace('y', 200);
second.emplace('z', 300);
cout << '\n';
for(auto &x:second) cout << x.first << ":" << x.second << '\t';
auto it = second.end();
it = second.emplace_hint(it, 'b', 20);
second.emplace_hint(it, 'a', 10);
second.emplace_hint(it, 'c', 30);
cout << '\n';
for(auto &x:second) cout << x.first << ":" << x.second << '\t';
map<char,int> third;
/** 获取key 比较器 */
map<char,int>::key_compare third_comp = third.key_comp();
third['a'] = 100; third['b'] = 200;
third['c'] = 300; third['d'] = 400;
third['e'] = 500; third['f'] = 600;
char dCh = 'd';
it = third.begin();
cout << '\n';
do{
cout << it->first << ":" << it->second << '\t';
}while( third_comp( (*it++).first, dCh ) );
pair<char,int> dValue = *third.rbegin();
it = third.begin();
cout << '\n';
do{
cout << it->first << ":" << it->second << '\t';
}while( third.value_comp()( *it++, dValue ) );
it = third.find('b');
if( it != third.end() )
third.erase(it);
cout << '\n';
for( char cIndex = 'a'; cIndex < 'z'; cIndex++ )
{
cout << cIndex;
/** key == cIndex count */
if( third.count(cIndex) > 0 )
cout << " has \n";
else
cout << " not has.\n";
}
auto itlow = third.lower_bound('c'); ///< itlow points to c
auto itup = third.upper_bound('e'); ///< itup points to f (not e)
third.erase(itlow,itup);
cout << '\n';
for(auto &x:third) cout << x.first << ":" << x.second << '\t';
map<char,int> four;
four['a'] = 10; four['b'] = 20;
four['c'] = 30; four['d'] = 40;
four['e'] = 50; four['f'] = 60;
pair< map<char,int>::iterator, map<char,int>::iterator > ret;
ret = four.equal_range('b');
cout << "\n lower bound points to:"
<< ret.first->first << ":" << ret.first->second;
cout << "\n upper bound points to: "
<< ret.second->first << ":" << ret.second->second;
return 0;
}
Reference
C++ std::map的更多相关文章
- std::map用法
STL是标准C++系统的一组模板类,使用STL模板类最大的好处就是在各种C++编译器上都通用. 在STL模板类中,用于线性数据存储管理的类主要有vector, list, map 等等.本文主要 ...
- C++ std::map::erase用法及其陷阱
1.引入: STL的map中有一个erase方法用来从一个map中删除制定的节点 eg: map<string,string> mapTest; typedef map<string ...
- std::map
1.例: map<int,string> m_mapTest; m_mapTest.insert(make_pair(1,"kong")); m_mapTest.ins ...
- std::map的clear()没有用?
昨天晚上,我徒弟跑过来讲,他的程序的内存占用居高不下,愿意是std::map的clear()没有效果.于是我让他用erase(begin,end); 试试也不行. 代码如下: void release ...
- std::map的操作:插入、修改、删除和遍历
using namespace std; std::map<int,int> m_map; 1.添加 for(int i=0;i<10;i++) { m_map.insert(mak ...
- Using std::map with a custom class key
From: https://www.walletfox.com/course/mapwithcustomclasskey.php If you have ever tried to use a cus ...
- Std::map too few template arguments
在上述的代码中,红色波浪线的部分编译的时候报错: error C2976: 'std::map' : too few template arguments 换成std::map<std::str ...
- 使用std::map和std::list存放数据,消耗内存比实际数据大得多
使用std::map和std::list存放数据,消耗内存比实际数据大得多 场景:项目中需要存储一个结构,如下程序段中TEST_DATA_STRU,结构占24B.但是使用代码中的std::list&l ...
- STL之std::set、std::map的lower_bound和upper_bound函数使用说明
由于在使用std::map时感觉lower_bound和upper_bound函数了解不多,这里整理并记录下相关用法及功能. STL的map.multimap.set.multiset都有三个比较特殊 ...
随机推荐
- 【造轮子】打造一个简单的万能Excel读写工具
大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...
- JS核心系列:浅谈原型对象和原型链
在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...
- ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单
前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...
- Spark RDD 核心总结
摘要: 1.RDD的五大属性 1.1 partitions(分区) 1.2 partitioner(分区方法) 1.3 dependencies(依赖关系) 1.4 compute(获取分区迭代列表) ...
- favicon.ioc使用以及注意事项
1.效果 2.使用引入方法 2.1 注意事项:(把图标命名为favicon.ico,并且放在根目录下,同时使用Link标签,多重保险) 浏览器默认使用根目录下的favicon.ico 图标(如果你并没 ...
- 谈谈一些有趣的CSS题目(二)-- 从条纹边框的实现谈盒子模型
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- Swift enum(枚举)使用范例
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...
- GSD_WeiXin(高仿微信)应用源码
高仿微信计划:已经实现功能 1.微信首页(cell侧滑编辑.下拉眼睛动画.下拉拍短视频.点击进入聊天详情界面) 2.通讯录(联系人字母排序.搜索界面) 3.发现(朋友圈) 4.我(界面) 待实现功能( ...
- java.IO输入输出流:过滤流:buffer流和data流
java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...
- AEAI DP V3.6.0 升级说明,开源综合应用开发平台
AEAI DP综合应用开发平台是一款扩展开发工具,专门用于开发MIS类的Java Web应用,本次发版的AEAI DP_v3.6.0版本为AEAI DP _v3.5.0版本的升级版本,该产品现已开源并 ...