/*************************************************************************
> File Name: mmap.cpp
> Author:
> Mail:
> Created Time: 2020年05月20日 星期三 07时30分51秒
************************************************************************/
#include<iostream>
#include<map>
using namespace std;
int main(){
typedef std::pair<std::string,std::string> my_key_type;
typedef std::map<my_key_type,int> my_map_type;
typedef std::map<int,int> my_map_type2;
my_map_type m;
my_map_type2 m2;
m.insert(my_map_type::value_type(my_key_type("A","B"),43));
m.insert(my_map_type::value_type(my_key_type("A2","B2"),45));
m2.insert(my_map_type2::value_type(1,2));
m2.insert(my_map_type2::value_type(3,4));
my_map_type::iterator iterator;
my_map_type2::iterator iterator2;
for(iterator = m.begin();iterator !=m.end();iterator++)
{
//cout<< iterator->first<<endl; //这行会报错:error: no type named ‘type’ in ‘struct std::enable_if<false, std::basic_ostream<char>&>’
cout<< iterator->second<<endl;
}
for(iterator2 = m2.begin();iterator2 != m2.end(); iterator2++)
{
cout<< iterator2->first<<endl; //这行正常运行
cout<< iterator2->second<<endl;
}
return 0;
}
使用gdb进行调试
│16 my_map_type2 m2; │
│17 m.insert(my_map_type::value_type(my_key_type("A","B"),43)); │
│18 m.insert(my_map_type::value_type(my_key_type("A2","B2"),45)); │
│19 m2.insert(my_map_type2::value_type(1,2)); │
│20 m2.insert(my_map_type2::value_type(3,4)); │
│21 my_map_type::iterator iterator; │
│22 my_map_type2::iterator iterator2; │
│23 for(iterator = m.begin();iterator !=m.end();iterator++) │
│24 { │
│25 //cout<< iterator->first<<endl; //这行会报错:error: no type named ‘type’ in ‘struct std::enable_if<false, std::basic_ostream<char>&>’ │
│26 cout<< iterator->second<<endl; │
│27 } │
│28 for(iterator2 = m2.begin();iterator2 != m2.end(); iterator2++) │
│29 { │
│30 cout<< iterator2->first<<endl; //这行正常运行 │
│31 cout<< iterator2->second<<endl; │
│32 } │
b+ │33 return 0; │
│34 } │
│35 │
│36 │
│37 │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
B+>i33 return 0; L?? PC: ??
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and omain documentation resources online at: L33 PC: 0x5555555553b8
(gdb) r
Starting program: /home/acat/test/mmap
43
45
1
2
3
4
Breakpoint 1, main () at mmap.cpp:33
(gdb) p m
$1 = std::map with 2 elements = {[{first = "A", second = "B"}] = 43, [{first = "A2", second = "B2"}] = 45}
(gdb) p m2
$2 = std::map with 2 elements = {[1] = 2, [3] = 4}
(gdb)
从上面的gdb调试结果可以看出,输出结果是:
43
45
1
2
3
4
m的内容是:
{[{first = “A”, second = “B”}] = 43, [{first = “A2”, second = “B2”}] = 45}
m2的内容是:
{[1] = 2, [3] = 4}
解释:可能map中有很多的key,value对,但是在m中,key的本身是一个pair类型。可以看出,map中的key和value的表示形式是:{[key1]=value1,[key2]=value2},可以使用iterator来依次遍历各个[key]=value。在m中直接输出iterator->first却报错了(因为key是pair类型的)。而在m2中,iterator2->first能够直接输出(因为key是int类型的)
PS:
利用map的find方法,以key作为参数,找到map中对应key的iterator
typedef std::map<std::string,int *> my_map_type3;
my_map_type3 m3;
int aa = 3;
m3.insert(my_map_type3::value_type("lihao",&aa));
my_map_type3::iterator iterator3;
iterator3 = m3.find("lihao");
cout<< iterator3->first<<endl;
cout<< *iterator3->second <<endl;
输出:
lihao
3
参考:
https://stackoverflow.com/questions/15451287/what-does-iterator-second-mean
https://stackoverflow.com/questions/6371713/c-stl-map-stdpair-as-the-key