c++模板库容器list vector map set操作和性能对比
文章目录
- list
- vector
- map
- set
- 性能比较
- 总结
list
列表(list)是C++ STL中的一种容器类型,它是一个双向链表,可以在任意位置高效地添加、删除、移动元素。
以下是一些常用的列表操作:
- 创建列表
#include <list>
std::list<int> myList;
- 添加元素
myList.push_back(1); // 在列表尾部添加元素
myList.push_front(2); // 在列表头部添加元素
myList.insert(myList.begin(), 3); // 在指定位置插入元素
- 删除元素
myList.pop_back(); // 删除尾部元素
myList.pop_front(); // 删除头部元素
myList.erase(myList.begin()); // 删除指定位置的元素
- 遍历列表
std::list<int>::iterator it;
for(it=myList.begin(); it!=myList.end(); ++it) {std::cout << *it << ' ';
}
- 获取列表大小
std::cout << myList.size() << std::endl;
- 判断列表是否为空
if(myList.empty()) {std::cout << "List is empty" << std::endl;
}
- 清空列表
myList.clear();
- 列表排序
myList.sort(); // 默认从小到大排序
myList.sort(std::greater<int>()); // 从大到小排序
- 反转列表
myList.reverse();
以上是一些常用的列表操作,更多操作可以参考C++ STL中list的文档。
vector
C++中的vector是STL(标准模板库)中的容器之一,用于存储动态大小的元素序列。
以下是vector的常见操作:
- 创建一个空的vector:
vector<int> vec; // 创建一个空的vector<int>vector<string> strVec; // 创建一个空的vector<string>
- 在vector末尾添加元素:
vec.push_back(1); // 在vector末尾添加一个int类型元素1strVec.push_back("hello"); // 在vector末尾添加一个string类型元素"hello"
- 访问vector中的元素:
int firstElem = vec[0]; // 访问第一个元素string lastElem = strVec.back(); // 访问最后一个元素
- 获取vector的大小:
int size = vec.size(); // 获取vector中元素的个数bool isEmpty = strVec.empty(); // 判断vector是否为空
- 删除vector中的元素:
vec.pop_back(); // 删除vector末尾的一个元素strVec.erase(strVec.begin() + 2); // 删除vector中索引为2的元素
- 清空vector中所有元素:
vec.clear(); // 清空vector中所有元素strVec.resize(0); // 将vector的大小设置为0
- 遍历vector中的所有元素:
for (int i = 0; i < vec.size(); i++) {cout << vec[i] << " ";}for (auto s : strVec) {cout << s << " ";}
第二种方法可以使用C++11中的range-based for循环。
map
C++中的map是STL(标准模板库)中的关联容器之一,用于存储键值对。
以下是map的常见操作:
- 创建一个空的map:
map<string, int> myMap; // 创建一个空的map,键为string类型,值为int类型
- 在map中插入键值对:
myMap.insert(make_pair("apple", 10)); // 在map中插入键为"apple",值为10的键值对myMap["banana"] = 20; // 在map中插入键为"banana",值为20的键值对
- 访问map中的元素或查找键:
int value = myMap["apple"]; // 访问键为"apple"的值auto it = myMap.find("banana"); // 查找键为"banana"的迭代器if (it != myMap.end()) {int value = it->second; // 获取迭代器指向的值}
- 获取map的大小:
int size = myMap.size(); // 获取map中键值对的个数bool isEmpty = myMap.empty(); // 判断map是否为空
- 删除map中的键值对:
myMap.erase("apple"); // 删除键为"apple"的键值对auto it = myMap.find("banana");if (it != myMap.end()) {myMap.erase(it); // 删除迭代器指向的键值对}
- 清空map中的所有键值对:
myMap.clear(); // 清空map中的所有键值对
- 遍历map中的所有键值对:
for (auto it = myMap.begin(); it != myMap.end(); it++) {cout << it->first << ": " << it->second << endl;}for (auto elem : myMap) {cout << elem.first << ": " << elem.second << endl;}
第二种方法可以使用C++11中的range-based for循环。
set
C++中的set是STL(标准模板库)中的关联容器之一,用于存储不重复的元素,并按照一定顺序进行排序。
以下是set的常见操作:
- 创建一个空的set:
set<int> mySet; // 创建一个空的set,元素为int类型
- 在set中插入元素:
mySet.insert(10); // 在set中插入元素10mySet.insert(20); // 在set中插入元素20mySet.insert(30); // 在set中插入元素30
- 访问set中的元素或查找元素:
auto it = mySet.find(20); // 查找元素20的迭代器if (it != mySet.end()) {int value = *it; // 获取迭代器指向的值}
- 获取set的大小:
int size = mySet.size(); // 获取set中元素的个数bool isEmpty = mySet.empty(); // 判断set是否为空
- 删除set中的元素:
mySet.erase(20); // 删除元素20auto it = mySet.find(30);if (it != mySet.end()) {mySet.erase(it); // 删除迭代器指向的元素}
- 清空set中的所有元素:
mySet.clear(); // 清空set中的所有元素
- 遍历set中的所有元素:
for (auto it = mySet.begin(); it != mySet.end(); it++) {cout << *it << endl;}for (auto elem : mySet) {cout << elem << endl;}
第二种方法可以使用C++11中的range-based for循环。
性能比较
使用相同的算法,对vector、list和set进行插入数据和删除数据操作
//insert number to list,increasing sort
void insert_l(int arg){list<int>::iterator iter;for(iter = gl.begin();iter!=gl.end();iter++){//ergodic listif(arg<*iter){gl.insert(iter,arg);//insert numberbreak;}}if(iter == gl.end()){gl.push_back(arg);//push back number}
}
//delete number from list
void delete_l(){default_random_engine e1(seed);//new random engine with seedwhile(!gl.empty()){uniform_int_distribution<unsigned> u(0,gl.size()-1);list<int>::iterator iter = gl.begin();//using iteratorfor(int i=0;i<u(e1);i++){iter++;}gl.erase(iter);//delete number}
}
结果
Data Size | Vector Time (s) | List Time (s) |
---|---|---|
10000 | 0.281257 | 0.527096 |
50000 | 6.792 | 23.2029 |
100000 | 26.824 | 107.947 |
150000 | 60.0688 | 333.013 |
200000 | 106.619 | 807.597 |
使用set在插入和删除200 000数据总共只用了2.2331秒、而vector用了106.619秒、list用了807.597秒
总结
vector的遍历性能明显比list要快。这是因为vector的元素是存储在一块连续的内存空间中,可以直接通过指针进行访问。而list的元素是通过链表相互连接起来的,无法直接访问,需要遍历整个链表才能访问某个元素,因此遍历性能相对较低。
vector和list在不同场景下有不同的优劣势,需要根据具体情况选择适合的容器。例如,需要随机访问或者高效的遍历操作时,可以选择vector;需要频繁的插入或者删除操作时,可以选择list。
set是基于红黑树实现的,红黑树是一种自平衡的二叉查找树,它具有快速的插入、删除和查找操作的时间复杂度,因此在处理大量数据时,set的性能表现会更好。
相关文章:
c++模板库容器list vector map set操作和性能对比
文章目录 listvectormapset性能比较总结 list 列表(list)是C STL中的一种容器类型,它是一个双向链表,可以在任意位置高效地添加、删除、移动元素。 以下是一些常用的列表操作: 创建列表 #include <list> std…...
windows服务添加 nginx 开机自启
软件下载 将下载的压缩包解压后得到nssm.exe。 安装nginx为服务 我们直接打开cmd执行: nssm install 即可...
【Redis】redis的特性和使用场景
Redis的特性 速度快基于键值对的数据结构服务器丰富的功能简单稳定客⼾端语⾔多持久化主从复制⾼可⽤(HighAvailability)和分布式(Distributed) 速度快 Redis 执⾏命令的速度⾮常快。 Redis 的所有数据都是存放在内存中的&…...
opengauss数据备份(docker中备份)
首先如果想直接在宿主机上进行使用gs_dump备份需要glibc的版本到2.34及以上,查看版本命令为 ldd --version 如图所示,本宿主机并不满足要求,所以转向在docker容器中进行备份, 然后进入opengauss容器中,命令为 docker…...
WebKit Inside: CSS 样式表的解析
CSS 全称为层叠样式表(Cascading Style Sheet),用来定义 HTML 文件最终显示的外观。 为了理解 CSS 的加载与解析,需要对 CSS 样式表的组成,尤其是 CSS Selector 有所了解,相关部分可以参看这里。 HTML 文件里面引入 CSS 样式表有 …...
javaee之Elasticsearch相关知识
简单说一下Elasticsearch相关知识 其余的参考官网文档 我们还可以用下面的方式来查 看一下原始索引库的模板 下面看一下数据库映射关系 下面就是更改了id1的所有数据 下面是我索引库中的内容 说一下查询之后,一些属性的含义 上面案例是这样理解的 match查询类型会对…...
【SpringCloud】微服务技术栈入门3 - Gateway快速上手
目录 GatewayWebFlux网关基本配置过滤器与断言工厂全局过滤器跨域处理 CORS Gateway WebFlux gateway 基于 webflux 构建 WebFlux 是基于反应式流概念的响应式编程框架,用于构建异步非阻塞的 Web 应用程序。它支持响应式编程范式,并提供了一种响应式的方…...
《理解深度学习》2023最新版本+习题答案册pdf
刚入门深度学习或者觉得学起来很困难的同学看过来了,今天分享的这本深度学习教科书绝对适合你。 就是这本已在外网获13.1万次下载的宝藏教科书《理解深度学习》。本书由巴斯大学计算机科学教授Simon J.D. Prince撰写,全书共541页,目前共有21…...
课题学习(五)----阅读论文《抗差自适应滤波的导向钻具动态姿态测量方法》
一、简介 抗差自适应滤波:利用等价权函数和自适应因子合理的分配信息,有效地滤除钻具振动对动态姿态测量的影响。、 针对导向钻井工具动态测量受钻具振动的影响而导致测量不准确的问题,提出一种抗差自适应滤波的动态空间姿态测量方法。通…...
一个CPU是怎么寻址的?
目录 CISC vs RISC 概念和历史 CISC vs RISC 对比举例:X86的CAS(做原子操作的) 对比举例:ARM的CAS(做原子操作的) 指令寻址 指令中的操作数的寻址方式 各语言对象内存布局对比 C内存布局 理解编译单元 Java对象内存布局 python对象模型 CPU …...
提高网站性能的10种方法:加速用户体验和降低服务器负担
在今天的数字时代,网站性能对于吸引和保留用户至关重要。一个快速加载的网站不仅提供更好的用户体验,还有助于降低服务器负担。以下是10种提高网站性能的方法,旨在加速页面加载速度和减少服务器的工作负荷。 压缩网页资源 利用压缩算法如gzi…...
195、SpringBoot--配置RabbitMQ消息Broker的SSL 和 管理控制台的HTTPS
开启Rabbitmq的一些命令: 小黑窗输入: rabbitmq-plugins enable rabbitmq_management 启动控制台插件,就是启动登录rabbitmq控制台的页面 rabbitmq_management 代表了RabbitMQ的管理界面。 rabbitmq-server 启动rabbitMQ服务器 上面这个&…...
确定性执行
确定性执行是指在给定输入的情况下,在有限的时间内产生一致的输出。 也就是输入到输出的运行过程是确定的,输入与输出有如下关系: 输出 = f (输入)。 确定性执行主要涉及以下几个方面: 时间确定性:计算的输出始终在给定的某个时间点之前发生,即程序不能无限制地运行下去…...
docker compose 管理应用服务的常用命令
一 、docker compose 是什么 Docker Compose是一个用来管理多个关联容器的工具,可以根据配置文件自动构建、管理、编排一组容器。 Docker Compose语境下的“服务”是指一组容器共同构成的一个应用服务后端。 Docker Compose语境下的“项目”是由一个或多个应用服务…...
产品安全—CC标准 ISO/IEC 15408:2022
文章目录 1. 变化2. Part1 简介和一般模型3. Part2 安全功能组件4. Part3 安全保障组件5. Part4 评估方法和活动规范框架6. Part5 预定义的安全要求包7. 总结 1. 变化 增加了两个部分:评估方法和活动规范框架 & 预定义的安全要求包 术语已经过审查和更新&#…...
Pytorch笔记之回归
文章目录 前言一、导入库二、数据处理三、构建模型四、迭代训练五、结果预测总结 前言 以线性回归为例,记录Pytorch的基本使用方法。 一、导入库 import numpy as np import matplotlib.pyplot as plt import torch from torch.autograd import Variable # 定义求…...
哪个证券公司可以加杠杆,淘配网是您的杠杆综合网站!
在证券市场中,投资者经常寻求提高资金杠杆以获得更高的回报。杠杆交易可以让您在不必拥有等额本金的情况下,参与更多的交易活动。然而,为了进行杠杆交易,您需要找到一家证券公司或平台,可以为您提供这种服务。本文将介…...
万字解读|怎样激活 TDengine 最高性价比?
不知不觉间,TDengine 已经 6 岁多了。在这 6 年多的时间里,我们从零开始,在一行又一行代码的淬炼下,TDengine 从 1.6 走过 2.0,终于走到如今的 3.0 时代。 自 2022 年下旬发布以来,经过我们不断地打磨优化…...
【目标检测】大图包括标签切分,并转换成txt格式
前言 遥感图像比较大,通常需要切分成小块再进行训练,之前写过一篇关于大图裁切和拼接的文章【目标检测】图像裁剪/标签可视化/图像拼接处理脚本,不过当时的工作流是先将大图切分成小图,再在小图上进行标注,于是就不考…...
gitlab登录出现的Invalid login or password问题
前提 我是在一个项目里创建的gitlab账号,想在别的项目里登录或者官网登录发现怎么都登陆不上 原因 在GitLab中,有两种不同的账号类型:项目账号和个人账号(官网账号)。 项目账号:项目账号是在特定GitLab…...
git本地创建分支并推送到远程
1. 创建本地分支并切换到该分支 比如我创建dev分支。git checkout -b相当于把两条命令git branch 分支名、git checkout分支名合成一条,来实现一条命令新建分支切换分支。 git checkout -b dev 2. 将dev分支推送到远程 -u参数与--set-upstream这一串是一个意思&am…...
手机待办事项app哪个好?
手机是日常很多人随身携带的设备,手机除了拥有通讯功能外,还能帮助大家高效管理日常工作,借助手机上的待办事项提醒APP可以快速地帮助大家规划日常事务,提高工作的效率。 过去,我也曾经在寻找一款能够将工作任务清晰罗…...
容器运行elasticsearch安装ik分词非root权限安装报错问题
有些应用默认不允许root用户运行,来确保应用的安全性,这也会导致我们使用docker run后一些操作问题,用es安装ik分词器举例(es版本8.9.0,analysis-ik版本8.9.0) 1. 容器启动elasticsearch 如挂载方式&…...
UE4游戏客户端开发进阶学习指南
前言 两年多前写过一篇入门指南,教大家在短时间内快速入门UE4的使用,在知乎被很多人收藏了。如今鸡佬使用UE快三年了,是时候更新一下进阶版本的学习指南。本文对于读者的要求: 有一定的C基础已经入门UE,能够用蓝图和…...
javaee SpringMVC 乱码问题解决
方法一 在web.xml文件中注册过滤器 <!-- 注册过滤器 设置编码 --><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param&…...
用ChatGPT做数据分析,提升10倍工作效率
目录 写报告分析框架报告框架指标体系设计 Excel 写报告 分析框架 拿到一个专题不知道怎么做?没关系,用ChatGPT列一下框架。 以上分析框架挺像那么回事,如果没思路的话,问问ChatGPT能起到找灵感的作用。 报告框架 报告的框架…...
【Pytorch笔记】4.梯度计算
深度之眼官方账号 - 01-04-mp4-计算图与动态图机制 前置知识:计算图 可以参考我的笔记: 【学习笔记】计算机视觉与深度学习(2.全连接神经网络) 计算图 以这棵计算图为例。这个计算图中,叶子节点为x和w。 import torchw torch.tensor([1.]…...
浏览器安装vue调试工具
下载扩展程序文件 下载链接:链接: 下载连接网盘地址, 提取码: 0u46,里面有两个crx,一个适用于vue2,一个适用于vue3,可根据vue版本选择不同的调试工具 crx安装扩展程序不成功,将文件改为rar文件然后解压 安装…...
C/C++学习 -- RSA算法
概述 RSA算法是一种广泛应用于数据加密与解密的非对称加密算法。它由三位数学家(Rivest、Shamir和Adleman)在1977年提出,因此得名。RSA算法的核心原理是基于大素数的数学问题的难解性,利用两个密钥来完成加密和解密操作。 特点 …...
基于若依ruoyi-nbcio支持flowable流程增加自定义业务表单(一)
因为需要支持自定义业务表单的相关流程,所以需要建立相应的关联表 1、首先先建表wf_custom_form -- ---------------------------- -- Table structure for wf_custom_form -- ---------------------------- DROP TABLE IF EXISTS wf_custom_form; CREATE TABLE wf…...
稳定免费域名/seo推广培训资料
题目链接:https://ctf.bugku.com/challenges 题解: 打开题目 得到一段PHP代码 该代码中相关函数知识点链接如下:extract函数:http://www.w3school.com.cn/php/func_array_extract.aspisset函数:http://php.net/manual/…...
网站添加缩略图/优化网站链接的方法
先说结论:使用命令行的rmdir总是可以把文件/文件夹清除,但是MFC自己的 DeleteFile函数有时出现删除失灵的情况(qt的QDir::removeRecursively()也有类似问题)。1) 使用cmd命令删除文件夹 出处:https://www..com/jiangyi666/p/6638815.htmlrmdi…...
肇庆制作网站软件/哪些行业适合做网络推广
apt-get install vim -y配置说明 vim /etc/vim/vimrc 在配置文件后加入这些配置项 set nuset tabstop4set nobackupset rulerset autoindentset nocompatible "//禁用兼容模式set shiftwidth4set softtabstop4set laststatus2set statusline\%<%F[%1*%M%*%n%R%H]%\%y\%…...
分类信息网站成都搭建/五年级上册优化设计答案
很多学校是使用校园一卡通作为老师学生的身份标识,进行进出学校、消费、借还书籍等操作,但实体卡片容易忘带、丢失、磨损、补办、冒用等问题。如今,可通过人脸识别系统解决校园卡使用过程的弊端,那应用人脸识别测温一体机…...
公司做网站怎么做账/制作链接的app的软件
SQL*PLUS维护系统变量,也称SET变量,利用它可为SQL*PLUS交互建立一个特殊的环境,如:设置NUMBER数据的显示宽度;设置每页的行数;设置列的宽度等。可用SET命令改变这些系统变量,也可用SHOW命令列出它们.show 系统变量如:SQL> show linesizelinesize 1000使用set命令…...
自贡做网站公司/百度推广平台有哪些
查看mysql用户表的结构,Field项都是各类权限限制 Host限制登录的IP,User限制登录的用户,Delete_priv限制删除权限,Grant_priv限制权限授予,Super_priv为超级权限,authentication_string为密码的加密字符串 …...