1.基本概念
map通过operate<()即less 比较元素,排列方式是平衡二叉树,查找元素复杂度log(n)
元素是以键的升序排列的,因为 map 中默认使用 less 函数对象对它们进行排序。
map元素是pair<constT,K>,键为常量不可修改
map迭代器可以++或者–,但是不可加减数字,需要用advance() std::advance(iter, 4); // begin iterator+ 4
count()参数键值,返回找到的个数0/1
map插入的对象的键如果是自己定义的类,则该类需要自定义operate<()
2.map创建:
{}初始化 map<int,string> m{{1,"A"},{2,"B"}};
make_pair()初始化 map<int,string> m{make_pair(1,"A")};
复制构造 map<string, size_t> personnel {people}
迭代器范围构造 map<string, size_t> personnel {begin(people),end(people)};
3.map插入:
(1)insert():
参数pair对象,返回一个 pair<iterator,bool> 对象。对象的成员 first 是一个迭代器,它要么指向插入元素,要么指向阻止插入的元素。second (布尔型)是返回对象,如果插入成功,返回值为 true,否则为 false。
ret_pr = people.insert(std::make_pair("Bill", 48));
pair()构造函数生成的对象作为参数,调用Insert的移动构造函数
ret_pr = people.insert(std::pair<const std::string, size_t> {"Bill", 48});
插入位置+pair对象作为参数
people.insert (ret_pr.first, std::make_pair ("Ian", 38));
初始化列表作为参数
crowd.insert({{"Bert", 44}, {"Ellen”, 99}});
(2)emplace:参数为对象的构造参数,直接构造
auto pr = people.emplace (Name { "Dan","Druff"},77);
emplace() 和 insert() 返回的 pair 对象提供的指示相同
emplace_hint() 提供一个指示元素生成位置的迭代器,如果新元素被插入,它返回的是指向新元素的迭代器;如果没有插入,返回的是和这个键匹配的现有元素的迭代器
auto pr = people.emplace(Name{"Dan","Druff"}, 77);
auto iter = people.emplace_hint (pr.first, Name {"Cal","Cutta"}, 62);
4.map元素获取
成员函数 at() 返回的是参数键对应的对象。如果这个键不存在,就会拋出 out_of_range 异常
auto value = people.at(key); //people为map,key为要查找的键
[]访问,参数为键,如果不存在则插入
auto value = people[Name {"Ned", "Kelly"}]; //值因为是int的,自动设为0
5.map删除元素
erase
(1)参数为键,移除键和参数匹配的元素,然后返回所移除元素的个数0/1
people.erase(name);
(2)参数为指向删除元素的迭代器,返回的迭代器指向被删除元素的下一个位置。
auto iter = people.erase(std::begin(people));
(3)移除两个迭代器参数所定义范围内的元素
auto iter = people.erase(++std::begin(people), --std::end(people));