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.hqwc.cn/news/127364.html

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

相关文章

一张图搞定英文星期、月份、季节总也搞不定的星期,月份,季节,一张图搞定,还有必用的常见搭配,再也不担心用错介词了~

一张图搞定英文星期、月份、季节 总也搞不定的星期&#xff0c;月份&#xff0c;季节&#xff0c;一张图搞定&#xff0c;还有必用的常见搭配&#xff0c;再也不担心用错介词了~

计算机毕设 招聘网站爬取与大数据分析可视化 - python 分析 可视化 flask

文章目录 0 前言1 课题背景2 实现效果3 Flask框架4 Echarts5 爬虫6 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自…

[引擎开发] 杂谈ue4中的Vulkan

接触Vulkan大概也有大半年&#xff0c;概述一下自己这段时间了解到的东西。本文实际上是杂谈性质而非综述性质&#xff0c;带有严重的主观认知&#xff0c;因此并没有那么严谨。 使用Vulkan会带来什么呢&#xff1f;简单来说就是对底层更好的控制。这意味着我们能够有更多的手段…

理解一致性哈希算法

摘要&#xff1a;一致性哈希是什么&#xff0c;使用场景&#xff0c;解决了什么问题&#xff1f; 本文分享自华为云社区《16 张图解 &#xff5c; 一致性哈希算法》&#xff0c;作者&#xff1a;小林coding。 如何分配请求&#xff1f; 大多数网站背后肯定不是只有一台服务器…

适老产品反“坑老”,美的智能化家电是否能坐稳银发经济顺风车?

随着我国老龄化程度不断加深&#xff0c;银发经济崛起早已成为不争的共识。早在2013年&#xff0c;《中国老年人家电需求研究报告》就曾预测&#xff0c;仅在城镇空巢老年人家庭&#xff0c;每年产生的老年家电需求规模就超过600亿元&#xff0c;加上非空巢老人的需求&#xff…

<el-input> textarea文本域显示滚动条(超过高度就自动显示)+ <el-input >不能正常输入,输入了也不能删除的问题

需求&#xff1a;首先是给定高度&#xff0c;输入文本框要自适应这个高度。文本超出高度就会显示滚动条否则不显示。 <el-row class"textarea-row"><el-col :span"3" class"first-row-title">天气</el-col><el-col :span&…

智能化物流管理:全国快递物流查询API的角色与优势

前言 当今社会&#xff0c;物流行业已经成为了国民经济的重要组成部分&#xff0c;而快递物流则是物流行业中的一个重要分支。随着信息技术的不断发展&#xff0c;智能化物流管理正逐渐成为快递物流领域的趋势&#xff0c;而全国快递物流查询API作为其中的一部分&#xff0c;在…

虚拟机Ubuntu18.04安装对应ROS版本详细教程!(含错误提示解决)

参考链接&#xff1a; Ubuntu18.04安装Ros(最新最详细亲测)_向日葵骑士Faraday的博客-CSDN博客 1.4 ROS的安装与配置_哔哩哔哩_bilibili ROS官网&#xff1a;http://wiki.ros.org/melodic/Installation/Ubuntu 一、检查cmake 安装ROS时会自动安装旧版的Cmake3.10.2。所以在…

mysql MVCC(多版本并发控制)理解

最近看MVCC相关资料&#xff0c;这边做一个记录总结&#xff0c;方便后续理解。 目录 一、MVCC相关概念 二、MVCC实现原理 1.隐藏字段 2.undo log 3.Read View 4.MVCC的整体处理流程 5. RC&#xff0c;RR级级别下的innoDB快照读有什么不同 6.总结 一、MVCC相关概念 1…

什么是业务流程图(TFD),数据字典(DD),数据流程图(DFD)

什么是业务流程图&#xff08;TFD&#xff09;&#xff0c;数据字典&#xff08;DD&#xff09;&#xff0c;数据流程图&#xff08;DFD&#xff09;&#xff1f; 答: TFD是一种描述系统内各单位、人员之间的业务关系、作业顺序和管理流向的图表&#xff0c;利用它可以帮助分析…

震撼消息!OpenAI考虑加入AI芯片制造联盟

原创 | 文 BFT机器人 OpenAI是著名的ChatGPT背后的强大力量&#xff0c;可能很快就会深入研究人工智能芯片制造的动态世界。据路透社最新报道&#xff0c;该公司正在积极考虑创建其独特的人工智能芯片&#xff0c;甚至正在考虑收购该领域的潜在目标。 全球对人工智能芯片的需求…

一些流程图(自用)

前端一次访问后端程序的请求流程 web程序运行流程