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.rhkb.cn/news/153598.html

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

相关文章

什么是信创测试?信创测试工具有哪些?

信创全称是“信息技术应用创新”&#xff0c;旨在实现信息技术自主可控&#xff0c;规避外部技术制裁和风险&#xff0c;其涉及产业链包括硬件、基础软件、应用软件、云服务、数据安全等领域。 信创测试是指对信创工程项目中的产品、系统等进行测试和验证&#xff0c;以确保其…

JVM 参数

JVM 参数类型大致分为以下几类&#xff1a; 标准参数&#xff08;-&#xff09;&#xff1a;保证在所有的 JVM 实现都支持的参数非标准参数&#xff08;-X&#xff09;&#xff1a;通用的&#xff0c;特定于 HotSpot 虚拟机的参数&#xff0c;这些参数不保证在所有 JVM 实现中…

用SegNext训练dms数据集(一)

数据集官方格式&#xff1a; 在mmseg/datasets下对数据集进行初始定义 在configs/_ _base_ _/datasets下对数据加载进行定义 在configs/下选择需要的模型参数进行修改 找了两个模型fcn和danet进行训练 类别数应该等于 n 1, 也就是多少类别背景。46类应该是47 返回tools/trai…

Flutter的Platform介绍-跨平台开发,如何根据不同平台创建不同UI和行为

文章目录 Flutter跨平台概念介绍跨平台开发平台相关性Platform ChannelPlatform-specific UIPlatform Widgets 如何判断当前是什么平台实例 Platform 类介绍获取当前平台的名称检查当前平台其他属性 利用flutter设计跨Android和IOS平台应用的技巧1. 遵循平台的设计准则2. 使用平…

mac(M1)卸载miniconda3

参考https://stackoverflow.com/questions/29596350/how-to-uninstall-mini-conda-python step1 因为我目前只有一个base环境&#xff0c;所以直接在这个环境中安装 anaconda-clean即可 conda install anaconda-clean然后继续输入 anaconda-clean如果不加–yes&#xff0c;那…

【C进阶】字符串函数

C语言中对字符和字符串的处理很频繁&#xff0c;但是C语言本身是没有字符串类型的&#xff0c;字符串通常放在常量字符串中或者字符数组中 字符串常量适用于那些对它不做修改的字符串函数 本章重点介绍处理字符串函数的库函数的使用和注意事项 一、字符串函数 这些函数都要引…

服务器数据恢复-VMWARE ESX SERVER虚拟机数据恢复案例

服务器数据恢复环境&#xff1a; 几台VMware ESX SERVER共享一台某品牌存储&#xff0c;共有几十组虚拟机。 服务器故障&#xff1a; 虚拟机在工作过程中突然被发现不可用&#xff0c;管理员将设备进行了重启&#xff0c;重启后虚拟机依然不可用&#xff0c;虚拟磁盘丢失&#…

学习Origin

最近&#xff0c;在学习Origin软件&#xff0c;网上资源还是很多的。我简单地记录了Origin的一些知识点&#xff0c;来督促自己的学习。 了解一下Origin的作用。 Origin入门教程&#xff08;一&#xff09;&#xff1a;一文学会Origin (sousepad.com) 该文讲述了Origin的一些基…

【SpringMVC篇】详解SpringMVC入门案例

&#x1f38a;专栏【SpringMVC】 &#x1f354;喜欢的诗句&#xff1a;天行健&#xff0c;君子以自强不息。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f38d;SpringMVC简介⭐优点 &#x1f33a;SpringMVC入门…

vscode的窗口下拉显示行数不够

这是为了减少程序的空间占用而存在的一个设置。设置一下即可。 设置方法 在左上角文件&#xff0c;个人设置&#xff0c;设置中&#xff0c;&#xff08;或者用Ctrl&#xff0c;打开&#xff09; 输入terminal&#xff0c;找到bell duration&#xff0c;设置成1000。 参考…

95、Spring Data Redis 之使用RedisTemplate 实现自定义查询 及 Spring Data Redis 的样本查询

Spring Data Redis 之使用RedisTemplate 实现自定义查询 Book实体类 原本的接口&#xff0c;再继承我们自定义的接口 自定义查询接口----CustomBookDao 实现类&#xff1a;CustomBookDaoImpl 1、自定义添加hash对象的方法 2、自定义查询价格高于某个点的Book对象 测试&a…

网络机顶盒哪个好?达人分享最新网络电视机顶盒排名TOP5

看视频、网游戏、上网课等等功能网络机顶盒都能实现&#xff0c;可以说是我们使用频率最高的了&#xff0c;尤其是对老人小孩来说。我每年都会进行上百次测评&#xff0c;网络机顶盒就是其中品类之一&#xff0c;很多朋友都在私信我不知道网络机顶盒哪个好&#xff0c;跟着我一…

bert入门

bert是什么 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种自然语言处理&#xff08;NLP&#xff09;中的预训练模型&#xff0c;它是基于Transformer架构的一种深度学习模型。BERT的主要目标是在大规模文本语料库上进行预训练&a…

3D 生成重建004-DreamFusion and SJC :TEXT-TO-3D USING 2D DIFFUSION

3D 生成重建004-DreamFusion and SJC &#xff1a;TEXT-TO-3D USING 2D DIFFUSION 文章目录 0 论文工作1 论文方法1.1论文方法1.2 CFG1.3影响1.4 SJC 2 效果 0 论文工作 对于生成任务&#xff0c;我们是需要有一个数据样本&#xff0c;让模型去学习数据分布 p ( x ) p(x) p(x…

C++ 获取文件创建时间、修改时间、大小等属性

简介 获取文件创建时间、修改时间、大小等属性 代码 #include <iostream> #include <string.h> #include <time.h>void main() {std::string filename "E:\\LiHai123.txt";struct _stat stat_buffer;int result _stat(filename.c_str(), &s…

Spring Data Redis使用方式

1.导入Spring Data Redis的maven坐标 pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2. 配置Redis数据源 2.1application.yml文件…

TLB、页表不命中后发生了什么

问题 下图中真题&#xff08;第三小问的“需要读TLB多少次”&#xff09;的答案是查TLB不命中后会再查一次TLB&#xff08;红色字体是王道的解析&#xff09;&#xff0c;而王道书里给出的地址变换流程图没有这个再查一次TLB的步骤。这要以哪个为准呢。 其实我一开始的理解是&…

手撕各种排序

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大一&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;掌握每种排序的方法&#xff0c;理解每种排序利弊…

Tomcat隔离web原理和热加载热部署

Tomcat 如何打破双亲委派机制 Tomcat 的自定义类加载器 WebAppClassLoader 打破了双亲委派机制&#xff0c;它首先自己尝试去加载某个类&#xff0c;如果找不到再代理给父类加载器&#xff0c;其目的是优先加载 Web 应用自己定义的类。具体实现就是重写 ClassLoader 的两个方法…

bootstrapjs开发环境搭建

Bootstrapjs是一个web前端页面应用开发框架&#xff0c;其提供功能丰富的JavaScript工具集以及用户界面元素或组件的样式集&#xff0c;本文主要描述bootstrapjs的开发环境搭建。 如上所示&#xff0c;使用nodejs运行时环境、使用npm包管理工具、使用npm初始化一个项目工程test…