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

推荐订阅源

B
Blog
I
InfoQ
Y
Y Combinator Blog
The Last Watchdog
The Last Watchdog
博客园_首页
The Cloudflare Blog
博客园 - 【当耐特】
Engineering at Meta
Engineering at Meta
罗磊的独立博客
月光博客
月光博客
V
V2EX
大猫的无限游戏
大猫的无限游戏
腾讯CDC
GbyAI
GbyAI
云风的 BLOG
云风的 BLOG
Stack Overflow Blog
Stack Overflow Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Attack and Defense Labs
Attack and Defense Labs
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Google Online Security Blog
Google Online Security Blog
B
Blog RSS Feed
Webroot Blog
Webroot Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
N
Netflix TechBlog - Medium
量子位
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Vercel News
Vercel News
C
CERT Recently Published Vulnerability Notes
人人都是产品经理
人人都是产品经理
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Recent Announcements
Recent Announcements
Cyberwarzone
Cyberwarzone
G
Google Developers Blog
H
Heimdal Security Blog
MyScale Blog
MyScale Blog
The Register - Security
The Register - Security
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
T
Tenable Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
O
OpenAI News
C
Check Point Blog
Forbes - Security
Forbes - Security
SecWiki News
SecWiki News
K
Kaspersky official blog
The GitHub Blog
The GitHub Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
F
Full Disclosure
阮一峰的网络日志
阮一峰的网络日志

博客园 - 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就好了