在阅读tvm源码时,发现了一个挺有意思的代码:

std::vector<std::pair<std::string, ObjectRef>> update;

vector容器里竟然存储的是键值对,amazing啊!!!还是第一次遇到这种写法的,这与直接写成map有啥不一样呢?


首先,这两种方式都可以用于存储键值对,只是它们具有不同的特性和实用场景。

  • std::vector<std::pair<std::string, ObjectRef>> 使用向量容器来存储键值对,元素在内存中是连续存储的,可以通过索引进行快速访问,容器内元素不会自动排序,允许元素重复。

    实用场景:需要频繁遍历或者按照索引访问元素的场景。对于查找特定键值的操作,需要线性搜索,时间复杂度为O(n)

    另:

    针对vector容器存储的是键值对的这种情况,如果需要对元素进行排序(如果业务需要,map满足不了),可重写sort中的排序规则,举例如下:
sort(s.begin(), s.end(), [&](const auto& x, const auto& y) {
return x.first * y.second < x.second * y.first;
// x.first/x.second < y.second/y.second (升序排序)
});
  • std::map<std::string, ObjectRef>是一个关联容器,使用红黑树来存储键值对,它会根据键值进行排序,可以快速查找特定键的值,时间复杂度为O(log(n)),但对于按照索引访问元素或遍历所有元素的情况,性能会比vector差。

因此,选择使用 std::vector<std::pair<std::string, ObjectRef>> 还是 std::map<std::string, ObjectRef> 取决于具体的需求和使用场景。

如果需要频繁遍历或按索引访问元素,可以选择 std::vector。如果需要快速查找特定键的值,可以选择 std::map。

STL vector容器存储键值对的更多相关文章

  1. 从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射

    从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射.Collection 接口又有 3 ...

  2. C++ STL vector容器学习

    STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector, ...

  3. 浅谈C++ STL vector 容器

    浅谈C++ STL vector 容器 本篇随笔简单介绍一下\(C++STL\)中\(vector\)容器的使用方法和常见的使用技巧.\(vector\)容器是\(C++STL\)的一种比较基本的容器 ...

  4. STL - vector容器

    1Vector容器简介 vector是将元素置于一个动态数组中加以管理的容器. vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲). vector尾部添加 ...

  5. STL vector容器 和deque容器

    前言 STL是C++的框架,然后vector容器和deque容器又是STL的一部分... 这块的内容都是理解.概念为主,没什么捷径,希望读者能静下来记. 先来讲vector容器(单端动态数组) 1.v ...

  6. 2.3 C++STL vector容器详解

    文章目录 2.3.1 引入 2.3.2 代码实例 2.3.3 运行结果 总结 2.3.1 引入 vector 容器 动态数组 可变数组 vector容器 单口容器(尾部操作效率高) vector动态增 ...

  7. Android - 数据存储 -存储键值对

    如果你有少量的键值数据需要存储,可以使用SharedPreferencesAPI.SharedPreferences对象指向一个包含键值对的文件并且提供了一些简单的方法来读取它们.每个SharedPr ...

  8. Java Dictionary 类存储键值

    字典(Dictionary) 字典(Dictionary) 类是一个抽象类,它定义了键映射到值的数据结构. 当你想要通过特定的键而不是整数索引来访问数据的时候,这时候应该使用Dictionary. 当 ...

  9. [C++STL] vector 容器的入门

    vector容器的入门 #include<vector> 创建vector容器的几种方式 数据类型可以是结构体,也能是另外一个容器 vector 的初始化: (1) 创建并声明大小 vec ...

  10. (bug更正)利用KVC和associative特性在NSObject中存储键值

    KVC 一直没仔细看过KVC的用法,想当然的认为可以在NSObject对象中存入任意键值对,结果使用时碰到问题了. 一个简单的位移动画: CAKeyframeAnimation *keyPosi=[C ...

随机推荐

  1. 离线环境安装nodejs及npm库i5ting_toc(超详细,手把手教学一通百通)

    一.离线环境先安装nodejs   1.在可联网的电脑上下载特定版本的 Node.js: 访问 Node.js 官方下载页面(https://nodejs.org/download/release/) ...

  2. UE蓝图:准心锁定敌人实现,通过UI锁定敌人

    UI控件蓝图   1.让UI动起来 (1) 创建事件AimMoveEvent,接受参数Dir,即UI的移动方向 (2) *5是控制ui的移动速度(阅者可自行调整,建议提升为参数),CorssHairP ...

  3. 腾讯解禁 QQ 极速版,且看我收集的最全 QQ 各类版本

    因为利益关系,腾讯早就限制QQ极速版的登录了,近日居然解除限制了,面对越来越臃肿的QQ,我给大伙准备了几十个版本的QQ,总有一个适合你. QQ版本合集 给大伙们收集了QQ版本合集,分别有历史版本.精简 ...

  4. 一文搞懂 APP 算法备案

    今天来给大家好好科普一下超重要的 APP 算法备案,这可是和我们日常使用 APP 以及 APP 运营都息息相关的知识点哦! 什么是算法备案 简单来讲,算法备案就相当于 APP 运营者要把自家 APP ...

  5. Go红队开发—文件操作

    目录 文件操作 创建目录 创建文件 获取File信息 文件重命名 删除文件 打开关闭文件 判断文件是否存在 判断文件是否有读取权限 复制文件 Read读取 ReadFull读取 ReadAtLeast ...

  6. 近1000 star,Forest 1.5.0 正式版发布

    简介 Forest是一个高层的.极简的轻量级HTTP调用API框架. 相比于直接使用Httpclient您不再用写一大堆重复的代码了,而是像调用本地方法一样去发送HTTP请求. 不需要调用HTTP底层 ...

  7. Prometheus Go client library 详解

    介绍 Prometheus 支持 4 种 指标类型,分别是 Counter.Gauge.Histogram 和 Summary. Counter 指标类型,指标值是只能递增,不能递减的数值.需要注意的 ...

  8. go 限流器 rate

    前言 Golang 官方提供的扩展库里就自带了限流算法的实现,即 golang.org/x/time/rate.该限流器也是基于 Token Bucket(令牌桶) 实现的. 限流器的内部结构 tim ...

  9. dify 1.0.1无法在ollama下新增LLM模型

    原来在0.15很正常,升到1.0.0之后就不行 了,再后来1.0.1出来后,以为问题都解决了,没想到还是有问题. 具体是:添加ollama是容易了,但是添加模型(比如deepsek)还是不行.表现为点 ...

  10. 插入排序(LOW)

    博客地址:https://www.cnblogs.com/zylyehuo/ # _*_coding:utf-8_*_ def insert_sort(li): for i in range(1, l ...