1. 程式人生 > >STL中vector/list的幾種賦值方法的速度比較

STL中vector/list的幾種賦值方法的速度比較

本文地址: http://blog.csdn.net/autophyte/archive/2008/11/08/3256096.aspx

    因為工作中遇到要對比較大的vector以及list進行比較頻繁的互相複製的動作,為了提高賦值速度,所以對幾種賦值方式的耗時進行了一下對比。

測試程式碼
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <vector>
  4. #include <list>
  5. #include <algorithm>
  6. #include <Windows.h>
  7. usingnamespace std;
  8. typedef vector<int>     vType;
  9. typedef list<int>       lType;
  10. constint TEST_MAX_LEN  =   100000;
  11. int _tmain(int argc, _TCHAR* argv[])
  12. {
  13.     vType       v1, v2;
  14.     lType       l1, l2;
  15. //初始化v1和l1
  16. for (int i=0; i<TEST_MAX_LEN; i++)
  17.     {
  18.         v1.push_back(i);
  19.         l1.push_back(i);
  20.     }
  21. //初始化計時器
  22.     LARGE_INTEGER   tmp;
  23.     LARGE_INTEGER   nSart;
  24.     LARGE_INTEGER   nEnd;
  25.     QueryPerformanceFrequency(&tmp);
  26. int freq = tmp.QuadPart;
  27. if (0==freq)    return -1;
  28. //用賦值操作符賦值vector
  29.     {
  30.         v2.clear();
  31.         QueryPerformanceCounter(&nSart);
  32.         v2 = v1;
  33.         QueryPerformanceCounter(&nEnd);
  34.         cout << "用賦值操作符賦值vector:/t"
  35.             << (nEnd.QuadPart-nSart.QuadPart)* 1000000/freq
  36.             << endl;
  37.     }
  38. //用賦值操作符賦值list
  39.     {
  40.         l2.clear();
  41.         QueryPerformanceCounter(&nSart);
  42.         l2 = l1;
  43.         QueryPerformanceCounter(&nEnd);
  44.         cout << "用賦值操作符賦值list:/t"
  45.             << (nEnd.QuadPart-nSart.QuadPart)* 1000000/freq
  46.             << endl;
  47.     }
  48. //用assign給vector賦值
  49.     {
  50.         v2.clear();
  51.         QueryPerformanceCounter(&nSart);
  52.         v2.assign(v1.begin(), v1.end());
  53.         QueryPerformanceCounter(&nEnd);
  54.         cout << "用assign給vector賦值:/t"
  55.             << (nEnd.QuadPart-nSart.QuadPart)* 1000000/freq
  56.             << endl;
  57.     }
  58. //用assign給list賦值
  59.     {
  60.         l2.clear();
  61.         QueryPerformanceCounter(&nSart);
  62.         l2.assign(l1.begin(), l1.end());
  63.         QueryPerformanceCounter(&nEnd);
  64.         cout << "用assign給list賦值:/t"
  65.             << (nEnd.QuadPart-nSart.QuadPart)* 1000000/freq
  66.             << endl;
  67.     }
  68. //用copy演算法給vector賦值(插入迭代器方式)
  69.     {
  70.         v2.clear();
  71.         QueryPerformanceCounter(&nSart);
  72.         copy(v1.begin(), v1.end(), inserter(v2, v2.begin()));
  73.         QueryPerformanceCounter(&nEnd);
  74.         cout << "用copy演算法給vector賦值(插入迭代器方式)"
  75.             << (nEnd.QuadPart-nSart.QuadPart)* 1000000/freq
  76.             << endl;
  77.     }
  78. //用copy演算法給list賦值(插入迭代器方式)
  79.     {
  80.         l2.clear();
  81.         QueryPerformanceCounter(&nSart);
  82.         copy(l1.begin(), l1.end(), inserter(l2, l2.begin()));
  83.         QueryPerformanceCounter(&nEnd);
  84.         cout << "用copy演算法給list賦值(插入迭代器方式)"
  85.             << (nEnd.QuadPart-nSart.QuadPart)* 1000000/freq
  86.             << endl;
  87.     }
  88. //用copy演算法給vector賦值(resize)
  89.     {
  90.         v2.clear();
  91.         QueryPerformanceCounter(&nSart);
  92.         v2.resize(v1.size());
  93.         copy(v1.begin(), v1.end(), v2.begin());
  94.         QueryPerformanceCounter(&nEnd);
  95.         cout << "用copy演算法給vector賦值(resize)"
  96.             << (nEnd.QuadPart-nSart.QuadPart)* 1000000/freq
  97.             << endl;
  98.     }
  99. //用copy演算法給list賦值(resize)
  100.     {
  101.         l2.clear();
  102.         QueryPerformanceCounter(&nSart);
  103.         l2.resize(l1.size());
  104.         copy(l1.begin(), l1.end(), l2.begin());
  105.         QueryPerformanceCounter(&nEnd);
  106.         cout << "用copy演算法給list賦值(resize)"
  107.             << (nEnd.QuadPart-nSart.QuadPart)* 1000000/freq
  108.             << endl;
  109.     }
  110. //用assign給vector賦值(從list)
  111.     {
  112.         v2.clear();
  113.         QueryPerformanceCounter(&nSart);
  114.         v2.assign(l1.begin(), l1.end());
  115.         QueryPerformanceCounter(&nEnd);
  116.         cout << "用assign給vector賦值(從list):/t"
  117.             << (nEnd.QuadPart-nSart.QuadPart)* 1000000/freq
  118.             << endl;
  119.     }
  120. //用assign給list賦值(從vector)
  121.     {
  122.         l2.clear();
  123.         QueryPerformanceCounter(&nSart);
  124.         l2.assign(v1.begin(), v1.end());
  125.         QueryPerformanceCounter(&nEnd);
  126.         cout << "用assign給list賦值(從vector):/t"
  127.             << (nEnd.QuadPart-nSart.QuadPart)* 1000000/freq
  128.             << endl;
  129.     }
  130.     getchar();
  131. return 0;
  132. }
測試結果:




總結:
vector:對於vector賦值方式中,assign的速度是最快的,其次是resize以後用copy演算法賦值,而最先能夠想到的賦值操作符,速度卻並不快,只能夠排名第三,目前還不知道這是為什麼,採用插入迭代器再用copy的方式是速度最慢的一種。

list:對於list賦值,賦值操作符的速度是最快的,其次是assign,然後是採用resize的copy,最後一位同樣是採用插入迭代子方式的copy。

相關推薦

STLvector/list方法速度比較

本文地址: http://blog.csdn.net/autophyte/archive/2008/11/08/3256096.aspx    因為工作中遇到要對比較大的vector以及list進行比較頻繁的互相複製的動作,為了提高賦值速度,所以對幾種賦值方式的耗時進行了一

關於Verilog語句

變量數據類型 ril 存儲 函數的調用 能夠 兩種 sig 註意 調用 http://www.cnblogs.com/nanoty/archive/2012/10/21/2733017.html 1. 連續賦值語句(Continuous Assignments)

Makefile方式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

STL有哪容器

 C++ 之高效使用STL (STL 容器的選擇) : 你知道C++中有很多你可以支配的容器,但是你意識到有多少嗎?要確定你沒有忽略你的選項,這裡有一個快速回顧。 •標準STL序列容器:vector、string、deque和list。 •標準STL關聯容器:set、mult

實際業務碰到的ajax請求方法總結

最近在做一個針對單個節點測速的功能頁面,測速的邏輯是,測上傳速度時,前端傳5m資料給server,記錄上傳和返回資料的時間,測下載速度時,從server下載1m的資料,記錄下載和下載成功的時間,上傳和下載用的是ajax同步以避免客戶端頻寬阻塞的問題,並進行3次取平均值。在開發過程過,因為ajax同步

java的算術運算子、運算子、比較運算子、邏輯運算子、條件運算子(huangf)

一、算術運算子 算術運算子主要用於進行基本的算術運算,如加法、減法、乘法、除法等。 Java 中常用的算術運算子: 其中,++ 和 – 既可以出現在運算元的左邊,也可以出現在右邊,但結果是不同滴 例1: 執行結果: 例2: 執行結果: 一定要注意哦!自增和自減運

委託三方法

 委託的意義是將方法作為引數傳遞 .net 有三種內建委託 方法的引數和型別必須和委託的引數、型別保持一致 委託的返回值型別和方法的返回值型別是一致的 有時候委託的意義和string 型別的意義是一樣的,但是我們可以給委託連續給多個方法,叫做多播委託,在呼叫委託的時候,方法會依次執行。

Struts2資料標籤(四)使用S:param標籤的三方法

1.新建JavaBean的例項:Java程式碼 package com.wl.control.Bean; public class UserInfo { private String name;

Spring容器定義Bean初始化方法和銷燬方法

Spring 容器中的 Bean 是有生命週期的,Spring 允許 Bean 在初始化完成後以及銷燬前執行特定的操作。下面是常用的三種指定特定操作的方法: 通過實現InitializingBean/DisposableBean 介面來定製初始化之後/銷燬之前

Spring容器的Bean初始化方法和銷燬方法的先後順序

Spring 容器中的 Bean 是有生命週期的,spring 允許 Bean 在初始化完成後以及銷燬前執行特定的操作。下面是常用的三種指定特定操作的方法: 通過實現InitializingBean/DisposableBean 介面來定製初始化之後/銷燬之前的操作方法;

Java迭代列表資料時迴圈寫法的效率比較

Java中經常會用到迭代列表資料的情況,本文針對幾種常用的寫法進行效率比較。雖然網上已經有了類似的文章,但是對他們的結論並不認同。 常見的實現方法: 1.for迴圈: for(int i = 0; i < list.size(); i++) for(int i =

論C++11 vector的N遍歷方法

隨著C++11標準的出現,C++標準添加了許多有用的特性,C++程式碼的寫法也有比較多的變化。 vector是經常要使用到的std元件,對於vector的遍歷,本文羅列了若干種寫法。 (注:本文中程式碼為C++11標準的程式碼,需要在較新的編譯器中編譯執行)假設有這樣的一個

EasyUI 之 DataGrid的兩方法

        上一篇部落格《EasyUI 之 DataGrid分頁元件中文顯示的兩種方法》中我們使用EasyUI-DataGrid在前臺添加了一個表格,並且讓表格的分頁控制元件顯示為中文。現在我們有

再談語言的執行速度比較:看第三方比較結論!

請參考以下第三方報告。可信度比較 高一些,沒有廣告成份。 http://economics.sas.upenn.edu/~jesusfv/comparison_languages.pdf C++ Fortan Julia Python Matlab R

STLvector以及 for_each用法

/* * vector_test.cpp * * Created on: 2015-3-22 * Author: gino */ #include <iostream> #include <vector> #includ

Mat 的初始化和方法

cto 轉換 -m mat tro sha 數據 return main 這幾天用到了由cv::Point3f和std::vector<float>到cv::Mat數據類型的轉換。本質上就是換一下容器。今晚做個小總結。 由Point3f 到 Mat 有兩種方法,

陣列的兩方式

陣列的賦值 我們知道,變數的三要素是:資料型別、變數名、值,那麼賦值給b變數有兩種賦值方式有兩種,分別是值傳賦值和用賦值,那麼兩者之間有什麼區別呢? 1、傳值賦值 傳值賦值是將變數的值複製出一份新的值(值是一樣的),只是在記憶體中出現兩份不同的記憶體空間。將新值記憶體空

java的list實現方式的效率(ArrayList、LinkedList、Vector、Stack),以及 java時間戳的三獲取方式比較

一、list簡介 List列表類,順序儲存任何物件(順序不變),可重複。 List是繼承於Collection的介面,不能例項化。例項化可以用: ArrayList(實現動態陣列),查詢快(隨

nsis常用的對$INSTDIR的兩方法

1. 在Function或者Section中,使用StrCpy對其進行賦值。 示例: Section "MainSection" SEC01   StrCpy $INSTDIR "D:\TEMP"   ....... SectionEnd 2. 直接賦值。在Functio

使用STL vector清空容器(刪除)辦法

轉載自:http://blog.csdn.net/metalkittie/article/details/3115750 vector <int> vecInt; for (int i=0;i<500;i++) { vecInt.push_bac