• std::map是一个包含了key-value键值对映射的排序分配容器。利用比较函数对key进行排序。搜索,删除和插入操作具有对数复杂性。 Maps通常实现为红黑树。标准库的每个地方都使用比较要求,唯一性通过使用等价关系来确定。

1、成员函数

  • map::map:构造函数,用来构造映射;
  • map::~map:析构函数,在对象撤销回收时调用;
  • map::operator=:分配值到容器中;
  • map::get_allocator:返回相关的分配值。

2、元素访问

  • map::at:使用边界检查访问指定的元素;
  • map::operator[]:接入或插入指定的元素。

3、迭代器Iterators(C++ 11)

  • map::begin/cbegin:返回一个迭代器给开始beginning.
  • map::end/cend:返回一个迭代器给末尾end.
  • map::rbegin/:crbegin:返回一个反向迭代器给开始beginning.
  • map::rend/crend:返回一个反向迭代器给末尾end.

4、容量Capacity

  • map::empty:检查容器是否为空。
  • map::size:返回元素的数量。
  • map::max_size:返回最大的可能元素数量。

5、修改函数(C++ 11和C++ 17)

  • map::clear:清楚元素内容。
  • map::insert:插入元素或节点。
  • map::insert_or_assign:插入一个元素,当key存在时,就分配给当前的元素。
  • map::emplace: 就地构造元素。
  • map::emplace_hint:使用提示就地构造元素。
  • map::try_emplace:如果key不存在,则就地插入元素;如果key存在,则不进行任何操作。
  • map::erase:擦除元素。
  • map::swap:交换内容。
  • map::extract:从容器中抽取节点。
  • map:merge:从另一个容器中拼接节点。

6、查找表Lookup

  • map::count:返回匹配具体key的元素数量。
  • map::find:查找具体key的元素。
  • map::contains:检查容器是否包含具体key的元素。
  • map::equal_range:返回匹配具体key的元素范围。
  • map::lower_bound:将迭代器返回给第一个不小于给定键的元素。
  • map::upper_bound:将迭代器返回给第一个大于给定键的元素

7、观察Observers

  • map::key_comp:返回比较key的函数。
  • map::value_comp:返回比较value_type类型的对象中的键的函数。

举例:

#include <iostream>
#include <string>
#include <iomanip>
#include <map> template<typename Map>
void print_map(Map& m) {
std::cout << '{';
for(auto& p: m)
std::cout << p.first << ':' << p.second << ' '; //first表示key, second表示value
std::cout << "}\n";
} struct Point {double x,y;};
struct PointCmp {
bool operator()(const Point& lhs, const Point& rhs) const {
return lhs.x < rhs.x;
}
}; int main() {
// 默认构造函数
std::map<std::string, int> map1;
map1["something"] = 69;
map1["anything"] = 199;
map1["that thing"] = 50;
std::cout << "map1 = ";
print_map(map1); // 范围构造
std::map<std::string, int> iter(map1.find("something"), map1.end());
std::cout << "\niter = ";
print_map(iter);
std::cout << "map1 = ";
print_map(map1); // 复制构造函数
std::map<std::string, int> copied(map1); //复制之后,原对象还存在数据
std::cout << "\ncopied = ";
print_map(copied);
std::cout << "map1 = ";
print_map(map1); // 移动构造函数
std::map<std::string, int> moved(std::move(map1)); //移动之后,原对象数据消失
std::cout << "\nmoved = ";
print_map(moved);
std::cout << "map1 = ";
print_map(map1); // 初始化构造列表
const std::map<std::string, int> init {
{"this", 100},
{"can", 100},
{"be", 100},
{"const", 100},
};
std::cout << "\ninit = ";
print_map(init); // 自定义键类选项1
// 使用比较构造
std::map<Point, double, PointCmp> mag = {
{{5, -12}, 13},
{{3, 4}, 5},
{{-8, -15}, 17}
}; for(auto p : mag)
std::cout << "The magnitude of {" << p.first.x
<< ", " << p.first.y << ") is "
<< p.second << "\n"; // 自定义键类选项1
// 使用lambda比较
auto cmpLambda = [&mag](const Point &lhs, const Point &rhs) { return mag[lhs] < mag[rhs]; };
std::map<Point, double, decltype(cmpLambda)> magy(cmpLambda); // 插入各种元素的各种方法~
magy.insert(std::pair<Point, double> ({5, -12}, 13));
magy.insert({{3, 4}, 5});
magy.insert({Point{-8.0, -15.0}, 17}); std::cout << "\n";
for(auto p : magy)
std::cout << "The magnitude of (" << p.first.x
<< ", " << p.first.y << ") is "
<< p.second << "\n";
}

输出为:

map1 = {anything:199 something:69 that thing:50 }

iter = {anything:199 something:69 that thing:50 }
map1 = {anything:199 something:69 that thing:50 } copied = {anything:199 something:69 that thing:50 }
map1 = {anything:199 something:69 that thing:50 } moved = {anything:199 something:69 that thing:50 }
map1 = {} init = {be:100 can:100 const:100 this:100 }
The magnitude of (-8, -15) is 17
The magnitude of (3, 4) is 5
The magnitude of (5, -12) is 13 The magnitude of (3, 4) is 5
The magnitude of (5, -12) is 13
The magnitude of (-8, -15) is 17

C++之标准库map的更多相关文章

  1. c/c++ 标准库 map multimap元素访问

    标准库 map multimap元素访问 一,map,unordered_map下标操作 下标操作种类 功能描述 c[k] 返回关键字为k的元素:如果k不在c中,添加一个关键字为k的元素,并对其初始化 ...

  2. c/c++ 标准库 map set 删除

    标准库 map set 删除 删除操作 有map如下: map<int, size_t> cnt{{2,22}, {3,33}, {1,11}, {4,44}; 删除方法: 删除操作种类 ...

  3. c/c++ 标准库 map set 插入

    标准库 map set 插入 一,插入操作 有map如下: map<string, size_t> cnt; 插入方法: 插入操作种类 功能描述 cnt.insert({"abc ...

  4. c/c++ 标准库 map set 大锅炖

    标准库 map set 大锅炖 一,关联容器有哪些 按关键字有序保存元素 map 保存key和value set 只保存key mulutimap key可以重复出现 multiset key可以重复 ...

  5. C++ Primer 有感(标准库map类型)

    map是键-值对的集合.map类型通常可以理解为关联数组:可以使用键作为下标获取一个值,正如内置数组一样.而关联的本质在于元素的值于某个特定的键相关联,而并非通过元素在数组中的位置获取. 1.map对 ...

  6. c++ 标准库的各种容器(vector,deque,map,set,unordered_map,unordered_set,list)的性能考虑

    转自:http://blog.csdn.net/truexf/article/details/17303263 一.vector vector采用一段连续的内存来存储其元素,向vector添加元素的时 ...

  7. STL标准库-容器-set与map

    STL标准库-容器-set与multiset C++的set https://www.cnblogs.com/LearningTheLoad/p/7456024.html STL标准库-容器-map和 ...

  8. Python标准库13 循环器 (itertools)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在循环对象和函数对象中,我们了解了循环器(iterator)的功能.循环器是对象的 ...

  9. 《C++ Primer》学习笔记【第二部分 C++标准库】

    第8章 IO库 IO对象不能复制,即1.IO对象不能存储在vector或其他容器中   2.如果需要传递或返回IO对象,必须传递或返回指向该对象的指针或引用. 一般情况下,如果要传递IO对象以便对它进 ...

随机推荐

  1. vue组件弹窗

    定义弹窗组件 先写一个普通的vue组件,其显示的内容就是弹窗的内容. 文件的位置 /src/views/toast/toast.vue <template> <div class=& ...

  2. BIOS 中断向量表

    中断 描述 INT 00h CPU:除零错,或商不合法时触发 INT 01h CPU:单步陷阱,TF标记为打开状态时,每条指令执行后触发 INT 02h CPU:非可屏蔽中断,如引导自我测试时发生内存 ...

  3. pymysql.err.InternalError: Packet sequence number wrong - got 45 expected 0

    原因: 使用了多线程,多线程共享了同一个数据库连接,但每个execute前没有加上互斥锁 方法: 方法一:每个execute前加上互斥锁 lock.acquire()         cursor.e ...

  4. Roomblock: a Platform for Learning ROS Navigation With Roomba, Raspberry Pi and RPLIDAR(转)

      What is this? "Roomblock" is a robot platform consists of a Roomba, a Raspberry Pi 2, a ...

  5. 求方差分析与两样本T检验 区别

    方差分析与两样本T检验. 1.首先可以看到方差分析(ANOVA)包含两样本T检验,把两样本T检验作为自己的特例.因为ANOVA可以比较多个总体的均值,当然包含两个总体作为特例.实际上,T的平方就是F统 ...

  6. 安卓GreenDao(基础)

    GreenDao的基础使用很简单,网上一大筐,推荐在简书里面搜索,那么我这里要说些什么呢,试想,这些简单的Demo可以带你了解GreenDao,但你能用这些代码做公司的项目么,肯定不行,所以我结合自身 ...

  7. P1450 [HAOI2008]硬币购物(完全背包+容斥)

    P1450 [HAOI2008]硬币购物 暴力做法:每次询问跑一遍多重背包. 考虑正解 其实每次跑多重背包都有一部分是被重复算的,浪费了大量时间 考虑先做一遍完全背包 算出$f[i]$表示买价值$i$ ...

  8. 解决 Invalid character found in method name. HTTP method names must be tokens 异常信息

    一个线上环境出现异常,不是spring boot. 解决方法: server.xml中加上maxHttpHeaderSize="8192" springBoot 1.x则是在app ...

  9. 翻译 | Improving Distributional Similarity with Lessons Learned from Word Embeddings

    翻译 | Improving Distributional Similarity with Lessons Learned from Word Embeddings 叶娜老师说:"读懂论文的 ...

  10. msgid 属性

    Android源码中的String.xml文件,msgid这个属性是干嘛的? 全局资源,方便引用.比如在布局的text和activity中用到.