惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
Google Online Security Blog
Google Online Security Blog
月光博客
月光博客
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
M
MIT News - Artificial intelligence
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
aimingoo的专栏
aimingoo的专栏
博客园 - 三生石上(FineUI控件)
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
The Cloudflare Blog
Blog — PlanetScale
Blog — PlanetScale
F
Full Disclosure
G
Google Developers Blog
罗磊的独立博客
Jina AI
Jina AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
A
About on SuperTechFans
IT之家
IT之家
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
有赞技术团队
有赞技术团队
GbyAI
GbyAI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
The Register - Security
The Register - Security
U
Unit 42
D
Docker
Martin Fowler
Martin Fowler
L
LINUX DO - 热门话题
NISL@THU
NISL@THU
阮一峰的网络日志
阮一峰的网络日志
C
Cybersecurity and Infrastructure Security Agency CISA
博客园_首页
Google DeepMind News
Google DeepMind News

博客园 - Evilbaniry

(转)浏览器的两种模式quirks mode 和strict mode Does a Nodelist contain circle? XML Dom所有的节点类型 ExtJS-2.2内存泄漏补丁 (转)VC中#pragma warning指令 #define总结 (网上资料汇集) 自已为Ext添加的DateTimeField控件(附源码) VC里一些容易混淆的地方(转) (转)GetWindowLongPtr释义 (转)消息分流器 GetModuleFileName()得到程序路径 利用GetDriveType来得到驱动器信息 makeintresource:VC MAKEINTRESOURCE 析疑 (转)c/c++的预处理定义 Stringizing Operator (#) Charizing Operator (#@) Token-Pasting Operator (##) va_start() va_end()函数应用 #ifdef __cplusplus 倒底是什么意思? (转)typedef用法小结 (转)STDAPI释义 判断windows系统类型
(转)std::map的用法总结
Evilbaniry · 2009-01-04 · via 博客园 - Evilbaniry

给出了map的基本用法如插入、查找、删除、遍历等等,同时告诉你如何实现双键map,包括 
(1) 只有两个键都匹配才命中目标
(2) 两个键中任意一个匹配就命中目标

可以扩展到多键

(一) 介绍
特点:
1.map将Key的object和T的Object绑定到一起,因此是一种Pair Associative Container, 表示其value type为 pair。
2.它同时也是Unique Associative Container,表示没有两个元素具有相同的Key。
3.它还是一种Sorted Associative Container,因此第三个参数只能是less,greater之类的functor, 相比较而言,
  hash table是 equal_to, not_equal_to之类的functor。
(二) 基本用法
通过以下范例,可以看出map的一些基本用法: 插入、查找、删除、遍历等等。

 1 #if defined (_MSC_VER)
 2 #pragma warning(disable: 4786)
 3 #endif
 4 #include <iostream>
 5 #include <map>
 6 #include <algorithm>
 7 int main(int argc, char *argv[])
 8 {
 9   /* define a map */
10   std::map _map;
11    
12   /* insert */
13   _map.insert( std::map::value_type(032.8) );
14   _map.insert( std::map::value_type(133.2) );
15   _map.insert( std::map::value_type(235.8) );
16   _map.insert( std::map::value_type(336.4) );
17   _map.insert( std::map::value_type(437.8) );
18   _map.insert( std::map::value_type(535.8) );
19    
20   /* 这个是常用的一种map赋值方法 */
21   _map[7= 245.3;
22    
23   /* find by key */
24   std::map::iterator itr;
25   itr = _map.find(4);
26    
27   if( itr != _map.end() )
28   {
29   std::cout << "Item:" << itr->first << " found, content: " << itr->second << std::endl;
30   }
31    
32   std::cout << std::endl;
33    
34   /* delete item from map */
35   if( itr != _map.end() )
36   {
37   _map.erase(itr);
38   }
39    
40   /* travel through a map */
41   std::map::iterator itr1 = _map.begin();
42   for( ; itr1 != _map.end(); ++itr1 )
43   {
44   std::cout << "Item:" << itr1->first << ", content: " << itr1->second << std::endl;
45   }
46    
47   std::cout << std::endl;
48    
49   /* empty a map */
50   _map.clear();
51    
52   return 0;
53 }

(三) 当Key是结构时该如何定义结构
比如 Key是结构MyStruct类型, 此时map可以定义如下:
std::map > _map;
其中Compare 缺省是std::less,这里可以不写,自定义的结构必须实现Compare指定的比较操作,因此自定义结构
MyStruct必须按照如下写法:

1 struct MyStruct
2 {
3   int key;
4    
5   bool operator < ( const MyStruct rhs) const
6   {
7   return key < rhs.key;
8   }
9 };

当然也可以实现全局operator <

1 bool operator < ( const MyStruct lhs, const MyStruct rhs) 
2 {
3   return lhs.key < rhs.key;
4 }

另外,当Compare 是std::greater时,需要实现 operator >
(四) 如何实现两个Key的map, 只有两个Key都匹配才命中目标
可以定义结构MyStruct如下:

 1 struct MyStruct
 2 {
 3   int key1;
 4   double key2
 5    
 6   bool operator < ( const MyStruct rhs) const
 7   {
 8   /* 两个key必须都匹配才命中 */
 9   return ( key1 < rhs.key1 || key2 < rhs.key2 );
10   }
11 };

(五) 如何实现两个Key的map, 两个Key中任意一个匹配就命中目标
可以定义结构MyStruct如下:

 1 struct MyStruct
 2 {
 3   int key1;
 4   double key2
 5    
 6   bool operator < ( const MyStruct rhs) const
 7   {
 8   /* 两个key任意一个匹配就命中 */
 9   return ( ( key1 < rhs.key1 || (key1 > rhs.key1 && key2 < rhs.key2 ) ) && ( key2 < rhs.key2 ) );
10   }
11 };

(六) 如果被存储的T允许重复,可用multimap
(七) 如果Key本身就是需要被存储的T, 只要将map换成set就好了