在阅读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. 1 前端知识学习-初始Web和Web标准

    0️⃣ 初始Web和Web标准 Web ​ Web(World Wide Web) 即全球广域网.也成为万维网.我们常说的Web端就是网页端. 网页 ​ 网页是构成网站的基本元素.网页主要由文字.图像 ...

  2. CF1693F题解

    备注 发表时间:2023-06-17 21:51 前言 yny 学长来 cdqz 讲课,写一篇讲课的题的题解纪念一下. 题意 给你一个 01 序列,有以下操作: 选择一段区间 设 \(cnt_0,cn ...

  3. Qt+OpenCV实现图片压缩(JPEG、PNG)

    一.概述 需求: 1.编写一个小工具实现图片压缩 2.图片仅支持JPEG和PNG格式 3.目的是压缩图片在磁盘中所占用的大小 4.使用的开发语言是Qt.C++.OpenCV 5.压缩的质量可以动态调节 ...

  4. Linux 安装配置Anaconda

    下载地址 https://www.anaconda.com/download/success 选择系统版本,复制链接 wget https://repo.anaconda.com/archive/An ...

  5. Windows下Cmake+VS2017+OpenSceneGraph环境搭建及采坑

    一.资料准备 1.OSG源码官网下载地址:http://www.openscenegraph.org/index.php/download-section/stable-releases或者OSGCh ...

  6. 开源组件DockerFIle老是Build失败,如何解决

    推荐把外网地址替换为国内高速镜像 # 替换源地址 http://dl-cdn.alpinelinux.org/alpine === https://mirrors.aliyun.com/alpine ...

  7. 【Linux】3.6 组管理和权限管理

    组管理和权限管理 1. Linux组基本介绍 Linux中每个用户属于一个组,不能独立于组以外.所以在Linux中每个文件存在组的概念: 所有者 所在组 其他组 改变用户所在组 2. 文件/目录所有者 ...

  8. HBase集群快速部署摘要

    HBase快速部署摘要 相关软件版本 系统:CentOS-7-1810 JDK:7u79 Hadoop:2.7.2 ZooKeeper:3.4.10 HBase:1.3.3 静态IP 位置 vi /e ...

  9. golang实现命令行程序的使用帮助

    通过flag包我们可以很方便的实现命令行程序的参数标志, 接下来我们来看看如何实现命令行程序的使用帮助, 通常以参数标志-h或--help的形式来使用. 自动生成使用帮助 我们只需要声明其他参数标志, ...

  10. SpringBoot启动方法分析

    SpringBoot启动run方法分析 1.场景引入 在项目启动的时候,有时候我们需要在启动的时候,执行一些逻辑. 比如说,项目启动的时候,我想把一些热门商品的数据加载到缓存中去: 比如说,自定义了一 ...