您的位置:首页 > 文旅 > 美景 > 移动网站建设制作_公司车辆管理系统软件_互联网营销师培训课程免费_常州百度推广公司

移动网站建设制作_公司车辆管理系统软件_互联网营销师培训课程免费_常州百度推广公司

2024/10/5 18:10:05 来源:https://blog.csdn.net/weixin_48013375/article/details/142615978  浏览:    关键词:移动网站建设制作_公司车辆管理系统软件_互联网营销师培训课程免费_常州百度推广公司
移动网站建设制作_公司车辆管理系统软件_互联网营销师培训课程免费_常州百度推广公司

从零开始手写STL库–multimap的实现

Gihub链接:miniSTL


文章目录

  • 从零开始手写STL库–multimap的实现
  • 一、multimap是什么?
  • 二、multimap要包含什么函数
  • 总结


一、multimap是什么?

如图multiset之于set,multimap相当于允许map重复储存键值

所以这里也是增加一个count来计数吗?这里是不可以的

multiset用count是因为key和value相同,而map的key和value是不同的

如果也用count来计数,那么考虑<1,2>和<1,5>的插入,由于key相同,所以后插入的会丢失,这显然不对

所以这里的想法是把红黑树的节点做成list,把所有key相同的值放在一个list中

二、multimap要包含什么函数

明确了设计思路,实际上就是红黑树的一层封装了

如下:

template <typename Key, typename Value> class MultiMap
{
public:using ValueType = std::list<Value>; MultiMap() : rbTree(), size(0) {}void insert(const Key &key, const Value &value) {ValueType *existingValues = rbTree.at(key);if (existingValues) existingValues->push_back(value);else {ValueType values;values.push_back(value);rbTree.insert(key, values);}size++;}void remove(const Key &key) {ValueType *existingValues = rbTree.at(key);if (existingValues) {size -= existingValues->size();rbTree.remove(key);}}void remove(const Key &key, const Value &value) {ValueType *existingValues = rbTree.at(key);if (existingValues) {existingValues->remove(value);size--;if (existingValues->empty()) rbTree.remove(key);}}ValueType *at(const Key &key) { return rbTree.at(key); }int getSize() { return size; }bool empty() { return size == 0; }private:myRedBlackTree<Key, ValueType> rbTree; size_t size;
};

总结

了解list作为节点代替红黑树常用节点即可,这是multimap实现的基本原理,其他考察点与map相同

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com