c++ map 使用方法

简介


  • map 是一种 关联容器,容器中的每个元素都由 关键字 (key)值 (value) 两部分组成,且每个元素的关键字不允许相同
  • map 中每个元素都按关键字 (key) 排序,容器中的元素始终遵循严格的顺序,所有插入的元素都按此顺序指定一个位置。
  • map 内部是用红黑树 (一种自平衡二叉查找树) 实现的
  • 容器使用分配器对象动态处理其存储需求。
  • map 可以在 O(log n) 时间内进行查找,插入和删除操作

C++ STL 中 map 的用法


  • 头文件 #include <map>
  • 需要使用 std 命名空间 using namespace std;
  • C++ 中的 map 模板以泛型方式实现,可以存储任意类型的数据
  • map中元素 typedef pair< const Key, T > value_type;
  • 下文中含有 c++11 标签的为 C++ 11 中的新特性

1.定义(初始化)map

  • map<int,double> m; 定义一个key为int类型,value为int类型的map
  • map<int,double,less<int> > m; map 内部元素按升序排列
  • map<int,double,greater<int> > m; map 内部元素按降序排列

注:有关内存分配器 (allocator) 的使用本文不进行描述,想要了解有关内容可以查阅 c++ 官方手册


2.向 map 中插入元素

使用 [] 操作符插入元素

  • m[0] = 1.23 // key = 0,value = 1.23

使用 insert 方法插入元素(前 key 后 value)

m.insert(pair<int, double>(1, 2.34))
m.insert(make_pair(2, 3.14))
m.insert(map<int, double>::value_type(3, 4.56))

使用 emplace 方法构造并插入元素 c++11

m.emplace(pair<int, double>(1, 2.34))
m.emplace(make_pair(2, 3.14))
m.emplace(map<int, double>::value_type(3, 4.56))

使用 emplace_hint 方法构造并插入元素 c++11

auto it = m.emplace(make_pair(2, 3.14));

m.emplace_hint(it.first,pair<int, double>(1, 2.34));
m.emplace_hint(it.first,make_pair(2, 3.14));
m.emplace_hint(it.first,map<int, double>::value_type(3, 4.56));

emplace 和 emplace_hint 具体用法及区别


3.查找 map 中元素

  • m.find(key) 查找指定 key 是否存在,存在返回指向该 key 的迭代器,否则返回指向 m.end() 的迭代器
  • m.count(key) 返回 key 对应的元素个数
    由于 map 容器 key 不允许重复,因此返回值为 1 或 0

4.删除 map 中元素

  • m.erase(key) 通过 key 删除元素
  • m.erase(it) 删除迭代器 it 指向的元素
  • m.erase(begin,end) 删除两个迭代器之间的元素
  • m.clear() 清空 map 中所有元素
//使用迭代器刪除 key 为 2 的元素
map<int,double>::iterator it = m.find(2);
m.erase(it);

//使用迭代器刪除范围内元素
m.erase(m.begin(), m.end());

5.遍历 map 中元素

  • m[i] 使用 [] 操作符获取 key 为 i 元素的 value
  • m.at(i) 使用 at 方法获取 key 为 i 元素的 value C++11
  • (*it).first 使用迭代器获取元素的 key
  • (*it).second 使用迭代器获取元素的 value

迭代器的获取:

  • m.begin() 返回指向 map 首元素的迭代器
  • m.end() 返回指向 map 尾元素位置+1的迭代器
  • m.rbegin() 返回指向 map 尾元素的反向迭代器
  • m.rend() 返回指向 map 首元素位置+1的反向迭代器
  • m.cbegin() 返回指向 map 首元素的常量迭代器 C++11
  • m.cend() 返回指向 map 尾元素位置+1的常量迭代器 C++11
  • m.crbegin() 返回指向 map 尾元素的反向常量迭代器C++11
  • m.crend() 返回指向 map 首元素位置+1的反向常量迭代器 C++11

注:常量迭代器 (const_iterator) 只能用于访问元素,不能修改元素

//直接访问元素
//注意:如果map中key不连续,空元素会返回0
for(int i=0;i<m.size();i++)
{
    cout<<i<<" "<<m[i]<<endl;
}

//使用迭代器遍历map容器
map<int, double>::iterator it;
for(it=m.begin();it!=m.end();it++)
{
	//cout<<(*it).first<<" "<<(*it).second<<endl; //也可以这样访问元素
    cout<<it->first<<" "<<it->second<<endl;
}

//使用常量迭代器遍历map容器
map<int, double>::const_iterator it;
for(it=m.cbegin();it!=m.cend();it++)
{
    cout<<it->first<<" "<<it->second<<endl;
}

//使用反向迭代器遍历map容器
map<int, double>::reverse_iterator it;
for(it=m.rbegin();it!=m.rend();it++)
{
    cout<<it->first<<" "<<it->second<<endl;
}

//使用反向常量迭代器遍历map容器
map<int, double>::const_reverse_iterator it;
for(it=m.crbegin();it!=m.crend();it++)
{
    cout<<it->first<<" "<<it->second<<endl;
}

6.其他方法

  • m.empty() 判断 map 容器是否为空,空返回1,非空返回0
  • m.size() 返回 map 容器大小(元素个数)
  • m.max_size() 返回 map 容器可以容纳的最大元素个数
  • m1.swap(m2) 交换 map m1 m2
  • m.upper_bound(key) 返回 key 大于给定 key 第一个位置的迭代器
  • m.lower_bound(key) 返回 key 大于等于给定 key 第一个位置的迭代器
  • m.key_comp() 返回比较元素 key 的 key_compare 对象
  • m.value_comp() 返回比较元素 value 的 value_compare 对象
  • m.get_allocator() 返回内存分配器对象
  • m.equal_range(key) 返回 pair 其中 pair::first 为 lower_bound 元素,pair::second 为 upper_bound 元素
发布了32 篇原创文章 · 获赞 104 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/csg999/article/details/103976933
今日推荐