C++ map
https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html map 是一种有序无重复的关联容器。 关联容器与顺序容器不同,他们的元素是按照关键字来保存和访问的,而顺序元素是按照它们在容器中的位置保存和访问的。 map保存的是一种 key - value 的pair对象,其中 key 是关键字,value 是关键字对应的值。通过 key找到对应的 value。map中按照 key的大小升序排列pair对象。 typedef pair 其中key 是 const的,即不可以改变map中的key。 在map中定位特定的元素比 unordered_map 要慢,因为在 map中需要根据 key的大小进行顺序查找。 但是在map中允许直接选取一定范围的元素。 map在底层通常用二叉搜索树实现。 template < class Key,// map::关键字类型 class T,// map::值类型 class Compare = less class Alloc = allocator > class map; 模板参数的第三个 class Compare = less 通过这个比较函数,map能比较两个不同的 key值的大小关系,及是否相等。默认采用 less 如果 Key类型没有"<"操作符的定义,则需要提供一个自定义比较函数的函数指针,来作为Compare函数。 构造函数 ? ? ? ?(1) 默认构造: map (2) 范围构造: map (3) 拷贝构造: map (4) 初始化列表构造:map 由于map 的 value_type 是 pair类型,所以要构造成pair作为列表,这是三种构造 pair的方式 map map map 赋值操作符= map& operator= (const map& x) ?// map赋值 map& operator= (map&& x)// 不懂 map& operator= (initializer_list 迭代器 begin,end,rbegin,rend cbegin,cend,crbegin,crend map 的迭代器支持 ++,-- 操作,但是不支持 +i 操作。 注意 map中是根据 key的值来排列元素的位置的,所以通过迭代器遍历出来的结果顺序,可能和插入值的顺序不同。 另外对 map的迭代器解引用的结果是得到一个 pair类型的对象。它有两个共有成员 first,second。first保存 key的值,second 保存value的值。 由于map的 key 是 const的,所以得到的 pair 的first 也是const 的。 成员函数 容量 empty()// 如果map 为空,返回true。否则返回 false // bool empty() const noexcept; size() // 返回map 中元素的大小,即 key-value 的个数 // size_type size() const noexcept; max_size() ?// 返回由于存储空间的限制,map有可能包含的最大元素数。但不保证一定能达到这个数量,有可能在中途申请空间失败。 // size_type max_size() const noexcept; 元素访问 操作符[]// m[k] 返回map 中 Key为 k的元素的value的引用。 // 如果 k不存在,那么将会插入一个 key为 k的元素,并返回其默认 value。 // []操作总会将 map的大小 +1 // 注意,对于map,解引用迭代器得到 pair,操作符[]得到 value at()// m.at(k) 返回map中Key为k的元素的value的引用。 // 如果k不存在,抛一个 out_of_range 异常。 // 使用 at 不会添加元素,不会增加 map的大小 修改 insert插入 (1) pair // 单个值插入,参数为 pair类型,first 为 key,second为 value // 返回值也是一个 pair,first为插入后的 iterator,second 为bool类型, true表示插入成功,false 表示插入失败 // 插入失败是因为 map 中已经有一个 key 与输入相同。这次插入操作对map 不会有任何影响, 失败时返回值的 first指向已有的key-value (2) iterator insert(const_iterator pos,const pair ?// 提示值插入 ?// 从 pos 指定的位置开始查找 val应该插入的位置 ?// 如果设定值合适,可以减少插入时做查找的时间 (3) void insert(iterator first,iterator second); ?// 范围插入,插入[first,second)范围内的内容 (4) void insert(initializer_list ?// 初始化列表插入 emplace高效插入 ?和 insert的主要区别在于,insert首先构造一个临时 value_type对象,再copy到 map中。 ?而emplace 是直接在map里根据参数构造 value_type对象。更高效。 ?pair ?返回值与 insert情况相同。 emplace_hint提示位置的高效插入 ?iterator emplace(const iterator pos,key k,value v); ?从pos开始查找应该插入的位置,其余和 emplace相同。 erase删除 ?(1) iterator erase(const_iterator position);// 删除迭代器指向的内容,函数返回 NULL ?(2) iterator erase(const_iterator first,const_iterator last);// 删除迭代器范围内的内容,函数返回NULL ?(3) size_type erase(const key_type &k); // 删除 type 为k的元素,返回删除的数目。对于 map,成功删除返回1,k不存在则返回0 ?(4) 1,2中如果迭代器无效,会产生 undefined behavior swap交换两个 map对象的内容 ?(1) void swap(map &x) ?(2) void swap(map &x1,map &x2)// 非成员重载函数 clear清空一个容器的所有元素 ?void clear() noexcept; 操作 find查找 在map中查找key 为 k的元素,返回指向它的迭代器。若k不存在,返回 map::end. //?iterator find(const key_type &k); count 计数 统计map中 key为k的元素的个数,对于map,返回值不是1(存在),就是0(不存在) // size_type count(const key_type &k) const; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |