当前位置: 首页 > 编程日记 > 正文

C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——插入

操作系统是Windows10 64bit,编译器是 Microsoft Virtual Studio Community 10。编译产出是64位测试程序。(转载请指明出于breaksoftware的csdn博客)

因为加入测量,就会导致误差。我已经尽量将环境影响降低,但是还是难免有误差。大家可以通过文后附的工程自行测量,结果可能和我存在一定的出入。

文中将测试vector、list、forward_list、deque、set(multiset)、unordered_set(unordered_multiset)、map(multimap)和unordered_map(unordered_multimap)。没有讨论stack、queue和priority_queue,是因为它们底层是使用deque或者vector实现的。

template <class T, class Container = deque<T> > class stack;
template <class T, class Container = deque<T> > class queue;template <class T, class Container = vector<T>,class Compare = less<typename Container::value_type> > class priority_queue;

增加和删除操作将从容器的头部、中部、尾部三个位置进行对比;这儿的三个位置并非是指其物理地址关系,而是指通过迭代器表现的位置关系。

遍历分为从头部和尾部两个方向遍历;

查找操作只对比set和map系列容器。因为其他容器的查找都需要遍历进行对比,性能远不及这两类容器。

插入

头部插入

元素个数>15000

insert_begin_16384_highest
insert_begin_16384_highest

vector性能最差,且和其他容器相比,要差好几倍。我们再看看其他容器的表现

insert_begin_16384
insert_begin_16384

表现最好的是deque。

元素个数<1024

insert_begin_1024_highest
insert_begin_1024_highest

元素个数在900左右以上时,vector的效率开始差于所有的容器。

元素个数在650到900之间,list的效率比其他容器都差。

元素个数<256

insert_begin_256_highest
insert_begin_256_highest

vector的效率要高于除了unordered_set之外的其他关联容器。

结果对比:

deque的性能是最好的,其次是unordered_set(神一般的存在)。

当元素个数比较多时,vector的性能是最差的。

forward_list要优于list。

除了unordered_set,其他关联容器性能都比非关联容器(除了vector)要差。

当元素个数比较多(大概大于2500)时,set的性能要高于map。multi系列的都要优于非multi系列(除了unordered_set)。比如multimap优于map;unordered_multimap优于unordered_map。

当元素个数比较少(大概小于256)时,有序关联容器的性能比无序(unordered)关联容器要高(除了unordered_set)。

中间插入

元素个数>15000

insert_mid_16384_highest
insert_mid_16384_highest

vector容器性能是最差的。再看下其他容器

insert_mid_16384
insert_mid_16384

forward_list和list的性能是最好的。然后是deque和set。

set容器是所有关联容器中性能最好的。

map和multimap性能仅优于vector。

元素个数<4096

insert_mid_4096_highest
insert_mid_4096_highest

元素个数大于2000左右开始,vector的性能将比所有容器都要差。

元素个数<256

insert_mid_256_highest
insert_mid_256_highest

vector的性能要优于其他容器。

当元素个数超过255时,deque的性能才超过vector。

结果对比:

当元素个数小于256时,vector的效率是最高的。但是随着元素个数增多,vector将变成性能最差的容器。

forward_list、list和deque在不同元素个数时表现的都很优异。

set容器是所有关联容器中性能最好的。

尾部插入

元素个数>15000

insert_end_16384_highest
insert_end_16384_highest

vector性能是最好的,其次是deque。

map性能是最差的。

结论:

在尾部插入时,vector的性能是最好的。其他两个场景下,vector的性能都是最差的。但是在中间插入场景,容器元素个数小于256时,vector还是最优的。但是之后衰退严重。

deque在头部和尾部插入元素场景下性能优异。

list和forward_list在中间插入元素场景下性能优异。

在关联容器中,只有在头部插入场景下的unordered_set性能极其优异。

当元素个数较多时,set的性能要优于map。

文中图例可从如下地址获取:https://github.com/f304646673/stl_perf/tree/master/windows

相关文章:

“夸夸机器人”App来了:变身百万粉丝大V,48万人给你的帖子点赞

来源 | mashable译者 | Kolen出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;我在Botnet上的第一条帖子获得了48万个赞。一款全新的社交媒体风格的应用为用户提供了生活在一个奇特网络虚拟世界的机会。在这个世界里&#xff0c;你将拥有数以百万计的粉丝&#xff0c;…

leetcode Reverse Linked List

Reverse a singly linked list 对于这种可以修改值的&#xff0c;把值逆序就可以了。。。。用vector存&#xff0c;然后逆序读。 都忘了指针怎么赋值初始化了。*p&head; 1 /**2 * Definition for singly-linked list.3 * struct ListNode {4 * int val;5 * Lis…

抗击新冠肺炎,如何进行实时动态时序图谱建模与分析?

作者 | 闭雨哲来源 | ThutmoseAI背景介绍新冠肺炎是一种具有最长达24天潜伏期的新型突发性传染疾病&#xff0c;这种特性给疫情防控带来了巨大的挑战&#xff0c;随着感染规模的不断扩增&#xff0c;简单的人为治理已不太奏效&#xff0c;使用“大数据”技术手段来辅助人为治理…

C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——删除

相关环境和说明在《C拾趣——STL容器的插入、删除、遍历和查找操作性能对比&#xff08;Windows VirtualStudio&#xff09;——插入》已给出。本文将分析从头部、中间和尾部对各个容器进行删除的性能。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 删除 …

关于服务器启动慢的问题

今天去了家医院的机房&#xff0c;走进去一看&#xff0c;TMD的医院就是有钱&#xff0c;全是光纤和千兆网络环境&#xff0c;全全是思科的三层交换机和路由器&#xff0c;HP的服务器。我们需要安装点东西&#xff0c;登录一台服务器&#xff0c;我一看配置&#xff0c;呵呵&am…

python依赖包exe文件安装问题

2019独角兽企业重金招聘Python工程师标准>>> 在使用python的exe程序安装依赖包的时候&#xff0c;经常会出现类似于下面的错误&#xff1a; python version 2.7 required,which was not found in the registry 可以使用如下代码解决该问题: # # script to register …

C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——遍历和删除

相关环境和说明在《C拾趣——STL容器的插入、删除、遍历和查找操作性能对比&#xff08;Windows VirtualStudio&#xff09;——插入》已给出。本文将分析各个容器中遍历和查找的性能。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 遍历 从前往后 travers…

技术战“疫”,贾扬清、李飞飞要给程序员直播讲AI技术!

「时势造英雄&#xff0c;英雄亦造时势。」在这场波及全球且看不见硝烟的疫情下&#xff0c;无数英雄日夜奋战&#xff0c;无论是身处一线的医护工作者、政府职能部门、志愿者&#xff0c;还是坚守在家的人民群众&#xff0c;都在尽自己所能&#xff0c;在行动&#xff01;与此…

关于端口映射的一个命令

今天安装一个远程会诊的系统&#xff0c;由于是在不同和的地方&#xff0c;需要在路由器上作下映射&#xff0c;由于是要远程连接对方的服务器&#xff0c;所以要在对方的路由器上设置下Interface fastethernet0/0 Ip address 192.168.1.1 255.255.255.0 Duplex auto Speed aut…

elasticsearch简介

Elasticsearch是 面向文档型数据库&#xff0c;这意味着它存储的是整个对象或者 文档&#xff0c;它不但会存储它们&#xff0c;还会为他们建立索引&#xff0c;这样你就可以搜索他们了。你可以在 Elasticsearch 中索引、搜索、排序和过滤这些文档。不需要成行成列的数据。所以…

C++拾取——使用stl标准库生成等差、等比数列的方法

代码是思想的表达。阅读代码是一个猜测、求证的过程。这个过程非常费脑&#xff0c;所以人们都不喜欢啰啰嗦嗦的表达方式。于是在相同认知水平下&#xff0c;简洁高效的表达是喜闻乐见的。本文将抛砖引玉&#xff0c;通过一些案例讲解如何去简化代码。&#xff08;转载请指明出…

利用NetBIOS名称与其他计算机通信

当某台计算机与网络中的其他计算机通信时&#xff0c;它是如何依据对方的计算机名称来得知其IP地址呢&#xff1f;名称解析的方法有以下几种&#xff1a; 检查NetBIOS名称缓存&#xff08;NetBIOS name cache&#xff09;广播直接向WINS服务器查询何谓NetBIOS名称&#xff1a;如…

编程语言性能实测,Go比Python更胜一筹?

作者 | Pawel Dziubałka, Sebastian Karasiewicz译者 | 泓技出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;互联网上有非常多的精彩代码&#xff0c;它们成了构建各种基础设施的基础。你正在阅读的这个平台同样也在致力于创建出色的代码。尽管普通用户一般不会注意…

mysql备份策略的制定

需要考虑的因素&#xff1a; 1. 数据库是不是都是innoDB引擎表 -》决定备份方式&#xff0c;热备或冷备 2. 数据量大小 -》逻辑备&#xff08;量小&#xff09;或物理备&#xff0c;全量或增量 3. 数据库本地空间是否充足 -》备份到本地或远程 4. 需要多快恢复 -》备份频率 小时…

C++拾取——使用stl标准库实现排序算法及评测

今天看了一篇文章&#xff0c;讲各种语言的优势和劣势。其中一个观点&#xff1a;haskell非常适合写算法&#xff0c;因为使用者不用去关心具体的计算机实现&#xff0c;而只要关注于操作语义。这让它在专心研究算法的人中非常受欢迎。所以很多时候&#xff0c;语言的争论没有太…

几行代码构建全功能的对象检测模型,他是如何做到的?

作者 | Alan Bi 译者 | 武明利&#xff0c;责编 | Carol 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 如今&#xff0c;机器学习和计算机视觉已成为一种热潮。我们都看过关于自动驾驶汽车和面部识别的新闻&#xff0c;可能会想象建立自己的计算机视觉模型有多酷。…

SQL操作全集

SQL操作全集 下列语句部分是Mssql语句&#xff0c;不可以在access中使用。 SQL分类&#xff1a; DDL—数据定义语言(CREATE&#xff0c;ALTER&#xff0c;DROP&#xff0c;DECLARE) DML—数据操纵语言(SELECT&#xff0c;DELETE&#xff0c;UPDATE&#xff0c;INSERT) DCL—数据…

css3媒体查询实现网站响应式布局

响应式建筑设计、响应式家具设计、响应式办公设计&#xff0c;这些词可能是已有的专业名词&#xff0c;也可能是我自己想出来的一些名词。因为在生活中&#xff0c;我们常常会见到很多让人惊叹的设计&#xff0c;为什么同一套东西经过不同的方式变化之后会给人不同的使用感受和…

流行于机器学习竞赛的Boosting,这篇文章讲的非常全了

作者 | AISHWARYA SINGH译者 | 武明利&#xff0c;责编 | Carol出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;你能说出至少两种机器学习中的 Boosting 吗&#xff1f;Boosting 已经存在了很多年&#xff0c;然而直到最近它们才成为机器学习社区的主流。那么&#x…

并行计算——OpenMP加速矩阵相乘

OpenMP是一套基于共享内存方式的多线程并发编程库。第一次接触它大概在半年前&#xff0c;也就是研究cuda编程的那段时间。OpenMP产生的线程运行于CPU上&#xff0c;这和cuda不同。由于GPU的cuda核心非常多&#xff0c;可以进行大量的并行计算&#xff0c;所以我们更多的谈论的…

JavaScript继承详解(四)

文章截图 - 更好的排版 在本章中&#xff0c;我们将分析Douglas Crockford关于JavaScript继承的一个实现 - Classical Inheritance in JavaScript。 Crockford是JavaScript开发社区最知名的权威&#xff0c;是JSON、JSLint、JSMin和ADSafe之父&#xff0c;是《JavaScript: The …

C语言:在屏幕上输出信息

#include<stdio.h>int main(){printf ("This is a C program.\n");printf("welcome to bit\n");return 0;}结果&#xff1a;This is a C program.welcome to bitPress any key to continue转载于:https://blog.51cto.com/yaoyaolx/1715542

Colly源码解析——框架

Colly是一个使用golang实现的数据抓取框架&#xff0c;我们可以使用它快速搭建类似网络爬虫这样的应用。本文我们将剖析其源码&#xff0c;以探析其中奥秘。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; Collector是Colly的核心结构体&#xff0c;其中包含了…

未经任何测试的源代码开放

未经任何测试的源代码开放 http://files.cnblogs.com/TextEditor/TextBoxEx.rar 这个代码只是一个Demo. 请将一个Vb.net的代码放在C盘下面&#xff0c;并且改名为Test.txt&#xff0c;然后使用菜单的Open来打开文件。 有任何问题&#xff0c;请在这里留言。 C#的上色还没有完成…

助力企业抗疫,360金融推出免费AI语音机器人

复工潮来临之际&#xff0c;为帮助各大企业进行高效的内部防疫宣传、员工行程信息收集以及快速生成公司内部防疫排班表&#xff0c;360金融针对复工企业的需求痛点推出了AI语音机器人&#xff0c;以助力企业更高效的防疫、抗疫。 针对复工企业的需求痛点&#xff0c;360金融人…

实现strncat

函数原型char *strncat(char *front,char *back,size_t count)参数说明back为源字符串&#xff0c;front为目的字符串&#xff0c;count为指定的back中的前count个字符。 所在库名#include <string.h>函数功能把back所指字符串的前count个字符添加到front结尾处&a…

Colly源码解析——结合例子分析底层实现

通过《Colly源码解析——框架》分析&#xff0c;我们可以知道Colly执行的主要流程。本文将结合http://go-colly.org上的例子分析一些高级设置的底层实现。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 递归深度 以下例子截取于Basic c : colly.NewCollecto…

无限路由 DI-624+A 详细介绍

无线路由器硬件安装设置图解1、确认宽带线路正常&#xff1a;无线宽带路由器可以让您将家中的计算机共享高速宽带网络连结至互联网&#xff1b;但在此之前&#xff0c;您必须先具备一部基于以太网络的Cable/DSL Modem(使用RJ-45 接头)&#xff0c;并确定您的宽带网络在只有连接…

教你如何编写第一个爬虫

2019年不管是编程语言排行榜还是在互联网行业&#xff0c;Python一直备受争议&#xff0c;到底是Java热门还是Python热门也是一直让人争吵的话题。随着信息时代的迭代更新&#xff0c;人工智能的兴起&#xff0c;Python编程语言也随之被人们广泛学习&#xff0c;Python数据分析…

【BZOJ】3542: DZY Loves March

题意 \(m * m\)的网格&#xff0c;有\(n\)个点。\(t\)个询问&#xff1a;操作一&#xff1a;第\(x\)个点向四个方向移动了\(d\)个单位。操作二&#xff1a;询问同行同列其他点到这个点的曼哈顿距离和。强制在线。&#xff08;\(n \le 10^5&#xff0c;m \le 10^{18}\)&#xff…