STL中vector/list的幾種賦值方法的速度比較
因為工作中遇到要對比較大的vector以及list進行比較頻繁的互相複製的動作,為了提高賦值速度,所以對幾種賦值方式的耗時進行了一下對比。
測試程式碼:
- #include "stdafx.h"
- #include <iostream>
- #include <vector>
- #include <list>
- #include <algorithm>
- #include <Windows.h>
-
usingnamespace std;
- typedef vector<int> vType;
- typedef list<int> lType;
- constint TEST_MAX_LEN = 100000;
- int _tmain(int argc, _TCHAR* argv[])
- {
- vType v1, v2;
- lType l1, l2;
- //初始化v1和l1
- for (int i=0; i<TEST_MAX_LEN; i++)
- {
- v1.push_back(i);
- l1.push_back(i);
- }
-
//初始化計時器
- LARGE_INTEGER tmp;
- LARGE_INTEGER nSart;
- LARGE_INTEGER nEnd;
- QueryPerformanceFrequency(&tmp);
- int freq = tmp.QuadPart;
- if (0==freq) return -1;
- //用賦值操作符賦值vector
- {
- v2.clear();
- QueryPerformanceCounter(&nSart);
- v2 = v1;
-
QueryPerformanceCounter(&nEnd);
- cout << "用賦值操作符賦值vector:/t"
- << (nEnd.QuadPart-nSart.QuadPart)* 1000000/freq
- << endl;
- }
- //用賦值操作符賦值list
- {
- l2.clear();
- QueryPerformanceCounter(&nSart);
- l2 = l1;
- QueryPerformanceCounter(&nEnd);
- cout << "用賦值操作符賦值list:/t"
- << (nEnd.QuadPart-nSart.QuadPart)* 1000000/freq
- << endl;
- }
- //用assign給vector賦值
- {
- v2.clear();
- QueryPerformanceCounter(&nSart);
- v2.assign(v1.begin(), v1.end());
- QueryPerformanceCounter(&nEnd);
- cout << "用assign給vector賦值:/t"
- << (nEnd.QuadPart-nSart.QuadPart)* 1000000/freq
- << endl;
- }
- //用assign給list賦值
- {
- l2.clear();
- QueryPerformanceCounter(&nSart);
- l2.assign(l1.begin(), l1.end());
- QueryPerformanceCounter(&nEnd);
- cout << "用assign給list賦值:/t"
- << (nEnd.QuadPart-nSart.QuadPart)* 1000000/freq
- << endl;
- }
- //用copy演算法給vector賦值(插入迭代器方式)
- {
- v2.clear();
- QueryPerformanceCounter(&nSart);
- copy(v1.begin(), v1.end(), inserter(v2, v2.begin()));
- QueryPerformanceCounter(&nEnd);
- cout << "用copy演算法給vector賦值(插入迭代器方式)"
- << (nEnd.QuadPart-nSart.QuadPart)* 1000000/freq
- << endl;
- }
- //用copy演算法給list賦值(插入迭代器方式)
- {
- l2.clear();
- QueryPerformanceCounter(&nSart);
- copy(l1.begin(), l1.end(), inserter(l2, l2.begin()));
- QueryPerformanceCounter(&nEnd);
- cout << "用copy演算法給list賦值(插入迭代器方式)"
- << (nEnd.QuadPart-nSart.QuadPart)* 1000000/freq
- << endl;
- }
- //用copy演算法給vector賦值(resize)
- {
- v2.clear();
- QueryPerformanceCounter(&nSart);
- v2.resize(v1.size());
- copy(v1.begin(), v1.end(), v2.begin());
- QueryPerformanceCounter(&nEnd);
- cout << "用copy演算法給vector賦值(resize)"
- << (nEnd.QuadPart-nSart.QuadPart)* 1000000/freq
- << endl;
- }
- //用copy演算法給list賦值(resize)
- {
- l2.clear();
- QueryPerformanceCounter(&nSart);
- l2.resize(l1.size());
- copy(l1.begin(), l1.end(), l2.begin());
- QueryPerformanceCounter(&nEnd);
- cout << "用copy演算法給list賦值(resize)"
- << (nEnd.QuadPart-nSart.QuadPart)* 1000000/freq
- << endl;
- }
- //用assign給vector賦值(從list)
- {
- v2.clear();
- QueryPerformanceCounter(&nSart);
- v2.assign(l1.begin(), l1.end());
- QueryPerformanceCounter(&nEnd);
- cout << "用assign給vector賦值(從list):/t"
- << (nEnd.QuadPart-nSart.QuadPart)* 1000000/freq
- << endl;
- }
- //用assign給list賦值(從vector)
- {
- l2.clear();
- QueryPerformanceCounter(&nSart);
- l2.assign(v1.begin(), v1.end());
- QueryPerformanceCounter(&nEnd);
- cout << "用assign給list賦值(從vector):/t"
- << (nEnd.QuadPart-nSart.QuadPart)* 1000000/freq
- << endl;
- }
- getchar();
- return 0;
- }
總結:
vector:對於vector賦值方式中,assign的速度是最快的,其次是resize以後用copy演算法賦值,而最先能夠想到的賦值操作符,速度卻並不快,只能夠排名第三,目前還不知道這是為什麼,採用插入迭代器再用copy的方式是速度最慢的一種。
list:對於list賦值,賦值操作符的速度是最快的,其次是assign,然後是採用resize的copy,最後一位同樣是採用插入迭代子方式的copy。
相關推薦
STL中vector/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
STL中vector以及 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