std:map与迭代器简析

来源:互联网 发布:腾讯tim ubuntu 编辑:程序博客网 时间:2024/06/06 20:10

背景

最近在读ROS操作系统源代码,多处遇到std::map这一容器。为更好理解ROS源代码,现将std::map的相关知识进行一个梳理。

因ROS而动意写此文,故主要描述与ROS代码相关部分。

容器map简析

std::map是一种关联容器,查询一个元素是否存在,并有效地获取元素。具体地,map是一个键/值(key/value)对,键(key)用于查询,而值(value)包含我们希望使用的数据。例如电话号码本,键是人名,而值是对应的电话号码。

#include <iostream>#include <map>int main() {  std::map<int, float> num_map;  num_map[4] = 4.13;  num_map[9] = 9.24;  num_map[1] = 1.09;  // 调用 a_map.begin() 及 a_map.end()  for (auto it = num_map.begin(); it != num_map.end(); ++it) {    std::cout << it->first << ", " << it->second << '\n';  }}

输出为:

1, 1.094, 4.139, 9.24

其中,调用的 a_map.begin() 及 a_map.end()属于迭代器,用于访问容器中的元素,详见下一节。对于迭代器,it->first提取键,it->second提取值。

map容器的常用成员函数:

  • bool empty() const;检查容器是否为空,即是否 begin() == end()
  • size_type size() const;返回容器中的元素数,即std::distance(begin(), end())
  • void clear();从容器移除所有元素。
  • void erase( iterator position );删除的元素pos;void erase( iterator first, iterator last );移除的元素的范围内[first; last).
  • iterator find( const Key& key );找到key对应的元素。例:
#include <string>#include <iostream>#include <map>int main(){    typedef std::map<std::string,int>  mapT;    mapT my_map;    my_map["first"]=  11;    my_map["second"]= 23;    mapT::iterator  it= my_map.find("first");    if( it != my_map.end() ) std::cout << "A: " << it->second << "\n";    it= my_map.find("third");    if( it != my_map.end() ) std::cout << "B: " << it->second << "\n";    // Accessing a non-existing element creates it    if( my_map["third"] == 42 ) std::cout << "Oha!\n";    it= my_map.find("third");    if( it != my_map.end() ) std::cout << "C: " << it->second << "\n";    return 0;}

输出:

A: 11C: 0

迭代器(iterator)简析

迭代器(iterator)提供了一种一般化的方法,对顺序或关联容器类型中的每个元素进行连续访问。例如,假设 iter 为任意容器类型的一个迭代器,则

++iter;

表示向前移动迭代器,使其指向容器的下一个元素 而

*iter

返回 iterator 指向的元素的值。
每种容器类型都提供一个 begin()和一个 end()成员函数

container.begin()//返回一个 iterator,它指向容器的第一个元素container.end()//返回一个 iterator,它指向容器的末元素的下一个位置

为了遍历容器中的每一个元素,我们可以这么写:

for (iter = container.begin();iter != container.end(); ++iter){do_something_with_element( *iter );}
原创粉丝点击