(转)std::map的用法总结
来源:互联网 发布:淘宝网我是卖家在哪里 编辑:程序博客网 时间:2024/06/07 05:09
给出了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(0, 32.8) );
14 _map.insert( std::map::value_type(1, 33.2) );
15 _map.insert( std::map::value_type(2, 35.8) );
16 _map.insert( std::map::value_type(3, 36.4) );
17 _map.insert( std::map::value_type(4, 37.8) );
18 _map.insert( std::map::value_type(5, 35.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 }
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(0, 32.8) );
14 _map.insert( std::map::value_type(1, 33.2) );
15 _map.insert( std::map::value_type(2, 35.8) );
16 _map.insert( std::map::value_type(3, 36.4) );
17 _map.insert( std::map::value_type(4, 37.8) );
18 _map.insert( std::map::value_type(5, 35.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 };
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 }
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 };
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如下:
0 0
- (转)std::map的用法总结
- std::map的用法总结
- std::map的用法总结
- std::map的用法总结
- std::map的用法
- std::map的一些用法
- std::string的用法总结
- std::string 的用法总结
- std::map::erase的用法及陷阱
- std::map lower_bound,upper_bound的用法举例
- std::map中erase的正确用法
- std::map::erase的用法及陷阱
- std::map::erase的用法及陷阱
- std::map::erase的用法及陷阱
- std::map::erase的用法及陷阱
- std::map::erase的用法及陷阱
- std::set 和 std::map 的基本用法
- std::map用法
- [LeetCode]--164. Maximum Gap(Radix Sort && Bucket Sort)
- 记两次NameNode响应延时问题
- key event监听back键
- 支持向量机
- Android WebView加载html5 3D全景
- (转)std::map的用法总结
- 华为OJ——图片整理
- Android HttpClient实例详解--用代码说话
- Codeforces Round #367 (Div. 2) D. Vasiliy's Multiset (tire 树)
- POJ 1470 Cloest Common Ancestor(用Tarjan查询LCA)
- 不同类型在不同位数机器的平台下长度
- 修改 tomcat 的内存
- Socket心跳包机制
- bzoj1047(单调队列,矩阵中)