首页 > 编程语言 >C++ vector和set排序效率比较

C++ vector和set排序效率比较

时间:2024-01-14 13:55:06浏览次数:29  
标签:src set tv res C++ vector 排序 include

转自:https://blog.csdn.net/adaptiver/article/details/52925792

1.介绍

vector+sort 实际是快排,快速排序是目前已知的所有排序算法中最快的排序算法。例子:

#include <vector>
#include <set>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
using  namespace  std;
double  time () {
   struct  timeval tv;
   if  (gettimeofday(&tv, NULL) != 0)  return  0.0;
   return  tv.tv_sec + tv.tv_usec / 1000000.0;
}
struct  Score {// 结构体比较简单
   string name;
   double  score;
   bool  operator <( const  Score& right)  const  {
     return  score < right.score;
   }
};
int  main( int  argc,  char ** argv) {
   vector<Score> src;
   for  ( int  i = 0; i < 10000000; i++) {
     int  num =  rand ();
     char  buf[32];
     sprintf (buf,  "%d" , num);
     Score score = { buf, num };
     src.push_back(score);
   }
   {
     double  stime =  time ();
     vector<Score> res;
     for  (vector<Score>::const_iterator it = src.begin();
          it != src.end(); ++it) {
       res.push_back(*it);
     }
     sort(res.begin(), res.end());
     double  etime =  time ();
     printf ( "vector: %f\n" , etime - stime);
   }
   {
     double  stime =  time ();
     multiset<Score> res;
     for  (vector<Score>::const_iterator it = src.begin();
          it != src.end(); ++it) {
       res.insert(*it);
     }
     double  etime =  time ();
     printf ( "multiset: %f\n" , etime - stime);
   }
   return  0;
}

//运行结果:
vector: 11.932973
multiset: 23.243538

把multiset改为set也是类似的结果,sort快排的效率更高。原因:

快速排序速度虽然快,但是在实际的运行过程中,它需要大量地拷贝元素,其拷贝操作的时间复杂度为o(NlogN);

而基于红黑树的multiset在排序的过程中则避免了元素的拷贝。如果元素的内存占用空间比较大,那么multiset排序的速度将比vector+sort快。

原博中把 Score加了个几个string成员数据,set的效率就更高了,//但我试了下不是。可能是和string的具体值有关系,涉及到了拷贝的效率。

2.其他 

  • hash的查找在不碰撞的情况下,效率是最高的,O(1)常数级。
  • 查找其次效率最高的是map,红黑树在插入时就排好序了。vector查找效率是线性的。
  • 百万级的数据放到vector不大合适。因为vector需要连续的内存空间,显然在初始化这个容器的时候会花费很大的容量。 如果内存不是考虑的问题,用vector比map好。map每插入一个数据,都要排序一次。所以速度反不及先安插所有元素,再进行排序。
  • 如果你需要在数据中间进行插入,list 是最好的选择,vector在中间插入效率很低。

 

标签:src,set,tv,res,C++,vector,排序,include
From: https://www.cnblogs.com/BlueBlueSea/p/17963641

相关文章

  • C++中for_each用法学习
    转自:chatgpt1.介绍std::for_each是C++标准库中的一个算法,用于对指定范围内的元素执行指定的操作。它的一般形式如下:template<classInputIt,classUnaryFunction>UnaryFunctionfor_each(InputItfirst,InputItlast,UnaryFunctionf);first和last是表示范围的......
  • C++U3-第09课-递归函数的应用
    学习目标 斐波那契数列例题  我们需要求出斐波那契第n项的值是多少【思路分析】我们用递归的方式去求解,当第一项和第二项返回1,否则返回前两项的和当前为第一项和第二项返回1当前不为第一项和第二项返回前两项的和定义n并把n输入,带入到递归求解【参考代......
  • 无涯教程-LISP - 集合(Set)
    adjoin函数首先在给定列表中查找该元素(如果找到),然后返回原始列表,否则,它将创建一个新的cons单元格,其car作为元素,而cdr指向原始列表,并返回此新列表。adjoin函数还使用:key和:test关键字参数。adjoin函数不会修改原始列表,因此要更改列表本身,您必须将adjoin返回的值分......
  • C++ 学习宝藏网站分享
    C++学习宝藏网站分享1.C++在线参考手册Cppreferencehttps://zh.cppreference.comC++开发者必备的在线参考手册,是我最常访问的C++网站之一。作为参考手册,不仅包含了语言本身的词法、语法特性,还包含了对C++标准库的介绍:需要include哪个头文件、接口参数/返回值说明......
  • C++源码中司空见惯的PIMPL是什么?
    前言:C++源码中司空见惯的PIMPL是什么?用原始指针、std::unique_ptr和std::shared_ptr指向Implementation,会有什么不同?优缺点是什么?读完这篇文章,相信你能搞懂这种设计方式并将其运用于实践,也将更容易阅读源码。1.PIMPL是什么?PIMPL是PointertoIMPLementation的缩写,意思是指......
  • C++多线程并发(一)--- 线程创建与管理
    目录进程和线程的区别何为并发?C++11线程基本操作C++11新标准多线程支持库std::thread类成员函数std::thread的关键总结C++中多线程创建C++的多线程可以充分利用计算机资源,提高代码运行效率。在这里总结了一些多线程应用过程中的基本概念和用法。进程和线程的区别进程是一......
  • C++实现文件内查找字符串
    实现概要:读取放入buf后查找匹配的第一个字符然后使用seek()移动文件指针,peek()查看剩余的字符是否匹配如果剩余的字符匹配把该字符串在文件中的位置push进一个vector<int>中再继续查看剩余的文件内容//str2.cpp--capacity()andreserve()#include<iostream>......
  • 从C向C++4——对象特性
    一.构造函数1.构造函数 在C++中,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行。这种特殊的成员函数就是构造函数(Constructor)。 我们通过成员函数setname()、setage()、setscore()分别为成员变量name、age、score......
  • C++ --- 智能指针
    一、智能指针存在的意义智能指针主要解决以下问题:(1)内存泄漏:内存手动释放,使用智能指针可以自动释放。(2)共享所有权指针的传播和释放,比如多线程使用同一个对象时析构问题。 智能指针的实现依赖于C++语言的RAII(资源获取即初始化)技术,即资源的获取和释放应该与对象的构造和析构分......
  • Controller(StatefulSet)-部署有状态应用,部署守护进程,一次任务和定时任务
    Controller(StatefulSet)-部署有状态应用在Kubernetes中,StatefulSet是一种用于部署有状态应用的控制器。与无状态应用不同,有状态应用需要保持持久性和可识别的网络标识。在有状态应用中,每个Pod都有一个唯一的标识符,并且Pod的创建和删除顺序是有序的。在StatefulSet中创建的Pod具有以......