c++模板库容器list vector map set操作和性能对比

文章目录

  • list
  • vector
  • map
  • set
  • 性能比较
  • 总结

list

列表(list)是C++ STL中的一种容器类型,它是一个双向链表,可以在任意位置高效地添加、删除、移动元素。

以下是一些常用的列表操作:

  1. 创建列表
#include <list>
std::list<int> myList;
  1. 添加元素
myList.push_back(1); // 在列表尾部添加元素
myList.push_front(2); // 在列表头部添加元素
myList.insert(myList.begin(), 3); // 在指定位置插入元素
  1. 删除元素
myList.pop_back(); // 删除尾部元素
myList.pop_front(); // 删除头部元素
myList.erase(myList.begin()); // 删除指定位置的元素
  1. 遍历列表
std::list<int>::iterator it;
for(it=myList.begin(); it!=myList.end(); ++it) {std::cout << *it << ' ';
}
  1. 获取列表大小
std::cout << myList.size() << std::endl;
  1. 判断列表是否为空
if(myList.empty()) {std::cout << "List is empty" << std::endl;
}
  1. 清空列表
myList.clear();
  1. 列表排序
myList.sort(); // 默认从小到大排序
myList.sort(std::greater<int>()); // 从大到小排序
  1. 反转列表
myList.reverse();

以上是一些常用的列表操作,更多操作可以参考C++ STL中list的文档。

vector

C++中的vector是STL(标准模板库)中的容器之一,用于存储动态大小的元素序列。

以下是vector的常见操作:

  1. 创建一个空的vector:
   vector<int> vec; // 创建一个空的vector<int>vector<string> strVec; // 创建一个空的vector<string>
  1. 在vector末尾添加元素:
   vec.push_back(1); // 在vector末尾添加一个int类型元素1strVec.push_back("hello"); // 在vector末尾添加一个string类型元素"hello"
  1. 访问vector中的元素:
   int firstElem = vec[0]; // 访问第一个元素string lastElem = strVec.back(); // 访问最后一个元素
  1. 获取vector的大小:
   int size = vec.size(); // 获取vector中元素的个数bool isEmpty = strVec.empty(); // 判断vector是否为空
  1. 删除vector中的元素:
   vec.pop_back(); // 删除vector末尾的一个元素strVec.erase(strVec.begin() + 2); // 删除vector中索引为2的元素
  1. 清空vector中所有元素:
   vec.clear(); // 清空vector中所有元素strVec.resize(0); // 将vector的大小设置为0
  1. 遍历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的常见操作:

  1. 创建一个空的map:
   map<string, int> myMap; // 创建一个空的map,键为string类型,值为int类型
  1. 在map中插入键值对:
   myMap.insert(make_pair("apple", 10)); // 在map中插入键为"apple",值为10的键值对myMap["banana"] = 20; // 在map中插入键为"banana",值为20的键值对
  1. 访问map中的元素或查找键:
   int value = myMap["apple"]; // 访问键为"apple"的值auto it = myMap.find("banana"); // 查找键为"banana"的迭代器if (it != myMap.end()) {int value = it->second; // 获取迭代器指向的值}
  1. 获取map的大小:
   int size = myMap.size(); // 获取map中键值对的个数bool isEmpty = myMap.empty(); // 判断map是否为空
  1. 删除map中的键值对:
   myMap.erase("apple"); // 删除键为"apple"的键值对auto it = myMap.find("banana");if (it != myMap.end()) {myMap.erase(it); // 删除迭代器指向的键值对}
  1. 清空map中的所有键值对:
   myMap.clear(); // 清空map中的所有键值对
  1. 遍历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的常见操作:

  1. 创建一个空的set:
   set<int> mySet; // 创建一个空的set,元素为int类型
  1. 在set中插入元素:
   mySet.insert(10); // 在set中插入元素10mySet.insert(20); // 在set中插入元素20mySet.insert(30); // 在set中插入元素30
  1. 访问set中的元素或查找元素:
   auto it = mySet.find(20); // 查找元素20的迭代器if (it != mySet.end()) {int value = *it; // 获取迭代器指向的值}
  1. 获取set的大小:
   int size = mySet.size(); // 获取set中元素的个数bool isEmpty = mySet.empty(); // 判断set是否为空
  1. 删除set中的元素:
   mySet.erase(20); // 删除元素20auto it = mySet.find(30);if (it != mySet.end()) {mySet.erase(it); // 删除迭代器指向的元素}
  1. 清空set中的所有元素:
   mySet.clear(); // 清空set中的所有元素
  1. 遍历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 SizeVector Time (s)List Time (s)
100000.2812570.527096
500006.79223.2029
10000026.824107.947
15000060.0688333.013
200000106.619807.597

使用set在插入和删除200 000数据总共只用了2.2331秒、而vector用了106.619秒、list用了807.597秒
在这里插入图片描述

总结

vector的遍历性能明显比list要快。这是因为vector的元素是存储在一块连续的内存空间中,可以直接通过指针进行访问。而list的元素是通过链表相互连接起来的,无法直接访问,需要遍历整个链表才能访问某个元素,因此遍历性能相对较低。
vector和list在不同场景下有不同的优劣势,需要根据具体情况选择适合的容器。例如,需要随机访问或者高效的遍历操作时,可以选择vector;需要频繁的插入或者删除操作时,可以选择list。
set是基于红黑树实现的,红黑树是一种自平衡的二叉查找树,它具有快速的插入、删除和查找操作的时间复杂度,因此在处理大量数据时,set的性能表现会更好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/100477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jetson Orin NX 开发指南(1): 系统烧录

一、SDK Manager SDK Manager 工具是 NVIDIA 官方推荐的烧写和管理 Jetpack 系统组件的一个图形化烧写工具&#xff0c;使用起来非常的简单方便&#xff0c;但是该软件需要在 x86 的 Ubuntu 18.04 或 Ubuntu 20.04 的系统上运行&#xff0c;因此我们需要准备一台安装了 Ubuntu…

记录:Unity脚本的编写3.0

目录 前言前置控制方法查看效果移动方式 前言 前面记录了一些通过脚本控制对象模型移动和通过用户的操作对模型进行变化的方法&#xff0c;那么为了让我们创造的不论是地形还是模型都拥有真实的物理引擎&#xff08;大雾&#xff09;&#xff0c;那么这次就使用脚本控制模型感…

函数reshape(-1,)里的-1的意思

reshape函数是对narray的数据结构进行维度变换&#xff0c;由于变换遵循对象元素个数不变&#xff0c;在进行变换时&#xff0c;假设一个数据对象narray的总元素个数为N&#xff0c;如果我们给出一个维度为&#xff08;m&#xff0c;-1&#xff09;时&#xff0c;我们就理解为将…

【Linux C】Linux如何执行一个程序(程序存储空间、系统调用、内核调用)

文章目录 一、程序存储空间1.1 C语言程序存储空间1.2 用户空间和内核空间1.3 用户模式和内核模式 二、内核调用-系统调用-C语言库函数2.1 系统调用和内核调用2.2 C语言库函数 三、Linux如何执行一个程序 一、程序存储空间 本节说的空间主要是指内存空间&#xff0c;即程序如何分…

链表(2)——带头双向循环链表

&#x1f341;一、链表的分类 &#x1f315;1.单向或者双向 &#x1f315;2.带头或者不带头&#xff08;有无哨兵&#xff09; &#x1f315;3.循环或者不循环 &#x1f315;4.无头单向非循环链表&#xff08;常用&#xff09; &#x1f315;5.带头双向循环链表&#xff08;常用…

案例分享:原生广告如何助力app实现高效变现收益的转化

原生广告是指将广告嵌入到APP的内容中&#xff0c;使其与APP内容融为一体&#xff0c;达到获得用户关注的效果。在形式上&#xff0c;原生广告并不像传统广告那样显眼&#xff0c;而是以一种更加自然的方式展现在用户面前。 它采用了与APP相似的设计风格和交互方式&#xff0c…

深度学习DAY1:神经网络NN;二元分类

深度学习笔记 DAY1 深度学习基本知识 1.神经网络 1.1 单一神经元 所有神经元将房屋大小size作为输入x,计算线性方程&#xff0c;结果取max&#xff08;0&#xff0c;y&#xff09;,输出预测房价y ReLU函数&#xff08;线性整流函数&#xff09;–max&#xff08;0&#xf…

Axios、SASS学习笔记

目录 前言 一、Axios基础认识 1、简介 2、相关文档 3、基本配置 4、基础快捷使用 二、Axios封装 1、公共配置文件 2、细化每个接口的配置 3、使用并发送请求 三、SASS 1、简介 2、相关文档 3、使用前奏 4、使用变量 5、嵌套规则 6、父级选择器标识 & 前言…

Linux基本指令(下)——“Linux”

各位CSDN的uu们好呀&#xff0c;今天&#xff0c;小雅兰的内容仍然是Linux中的基本指令啦&#xff0c;下面&#xff0c;让我们进入Linux的世界吧&#xff01;&#xff01;&#xff01; Cal指令 find指令&#xff1a;&#xff08;灰常重要&#xff09; -name grep指令 zip/un…

【置顶】关于博客的一些公告

所谓 万事开头难&#xff0c;最开始的两个专栏 《微机》 和 《骨骼动作识别》 定价 29.9 &#xff0c;因为&#xff1a; 刚开始确实比较困难&#xff0c;要把自己学的知识彻底搞懂讲给别人&#xff0c;还要 码字排版&#xff0c;从 Markdown 语法开始学起&#xff08;这都是 花…

Hadoop2.0探讨

文章目录 8. Hadoop 再探讨8.1 Hadoop的优化与发展8.2 HDFS 的FA和Federation(Hadoop2.0新特性)8.2.1 HDFS HA8.2.2 HDFS Federation 8.3 YARN8.3.1 MapReduce1.0的缺陷8.3.2 Yarn设计思路8.3.3 Yarn体系结构8.3.4 Yarn工作流程8.3.5 Yarn框架和MapReduce1.0框架对比分析8.3.6 …

【Java 进阶篇】CSS 选择器详解

CSS&#xff08;层叠样式表&#xff09;是一种用于描述网页上元素样式的语言。要想有效地使用CSS&#xff0c;了解CSS选择器是至关重要的&#xff0c;因为它们允许你选择要应用样式的HTML元素。在本文中&#xff0c;我们将详细介绍CSS选择器的各种类型和用法&#xff0c;以便你…

Vue中使用Echarts封装为公用组件(简单复制粘贴)

Vue中封装Echarts组件 前提直奔主题 本文以Vue3代码演示 Vue2同理 前提 中文官网&#xff1a; https://echarts.apache.org/zh/index.html npm安装Echarts npm install echarts or pnpm install echarts or yarn add echarts直奔主题 创建Echarts.vue文件&#xff0c;代码如…

Solidity 合约漏洞,价值 38BNB 漏洞分析

Solidity 合约漏洞&#xff0c;价值 38BNB 漏洞分析 1. 漏洞简介 https://twitter.com/NumenAlert/status/1626447469361102850 https://twitter.com/bbbb/status/1626392605264351235 2. 相关地址或交易 攻击交易&#xff1a; https://bscscan.com/tx/0x146586f05a451313…

Unity官方文档中关于内存管理的翻译(2021.3)

原文:Memory in Unity - Unity 手册 Unity内存管理 为了确保您的应用程序运行时没有性能问题&#xff0c;了解Unity如何使用和分配内存非常重要。本文档的这一部分解释了Unity中内存是如何工作的&#xff0c;适用于希望了解如何提高应用程序内存性能的读者。 Unity使用三个内…

视频答题猜歌闯关娱乐微信小程序源码支持看视频答题闯关听歌猜歌答题流量主模式(团队奖励等)

功能强大UI美观的视频答题猜歌闯关娱乐微信小程序源码下载 后台管理资源本地化带数据和视频教程&#xff0c;这是一款拥有后端的闯关娱乐小程序。 支持个人小程序和企业小程序上线运营 功能强大齐全,带数据本地化 (数据在自己服务器自己管理无需担心第三方失效的问题) 支持看视…

【重拾C语言】七、指针(二)指针与数组(用指针标识数组、多维数组与指针、数组指针与指针数组)

目录 前言 七、指针 7.1~3 指针与变量、指针操作、指向指针的指针 7.4 指针与数组 7.4.1 用指针标识数组 7.4.2 应注意的问题 a. 数组名是指针常量 b. 指针变量的当前值 c. 数组超界 7.4.3 多维数组与指针 7.4.4 指针数组 a. 指针数组 b. 数组指针 c. 对比总结 前…

Reactor网络模式

文章目录 1. 关于Reactor模式的了解2. 基于Reactor模式实现epoll ET服务器2.1 EventItem类的实现2.2 Reactor类的实现Dispatcher函数AddEvent函数DelEvent函数EnableReadWrite函数 2.3 四个回调函数的实现acceptor回调函数recver回调函数sender回调函数errorer回调函数 3. epol…

突破封锁|华为芯片10年进化史:从K3V1到麒麟9000S

华为海思麒麟芯片过去10年研发历程回顾如下&#xff1a; 2009年&#xff1a;华为推出第一款手机芯片K3V1&#xff0c;采用65nm工艺制程&#xff0c;基于ARM11架构&#xff0c;主频600MHz&#xff0c;支持WCDMA/GSM双模网络。这款芯片搭载在华为U8800手机上&#xff0c;标志着华…

在SOLIDWORKS搭建一个简易的履带式机器人

文章目录 前言一、构建模型基本单元二、搭建车体模块三.插入轮子4.构建履带 前言 趁着十一假期&#xff0c;在solidworks中搭建了一个履带式机器人小车&#xff0c;计划将其应用在gazebo中完成多机器人编队的仿真。 一、构建模型基本单元 构建底板&#xff08;a面&#xff09…