STL中queue,list,vector頻繁訪問效率
針對STL中的queue,list,vector頻繁訪問,即插入(尾部)與取出(頭部)操作時的效率進行了對比,從時間消耗上來看,queue最少,list與vector消耗相對較大,二者之間差別不大。附上類似分析一篇 :http://blog.csdn.net/lsldd/article/details/7857388。本文程式碼如下:
測試程式碼(部分):/* * msg.h * * Author: wdmcel */ #ifndef MSG_H_ #define MSG_H_ #include <iostream> #include <queue> #include <list> #include <vector> using namespace std ; template <typename T> class msg_queue_t { public : msg_queue_t(T data_) { m_queue.push(data_); m_excption = 0; } T pop_data() { if(0 != get_size()) { T data = m_queue.front(); m_queue.pop(); return data; } throw m_excption; } T get_first_data() { if(0 != get_size()) { return m_queue.front(); } throw m_excption; } T get_last_data() { if(0 != get_size()) { return m_queue.back(); } throw m_excption; } void insert_data(T c); int get_size() { return m_queue.size(); } void show_data() { for(int i = 1; i <= get_size(); i++) { T data = pop_data(); cout << data << "\t"; insert_data(data); } cout << endl; } private: queue <T> m_queue; int m_excption; }; template <typename T> void msg_queue_t<T>::insert_data(T data_) { m_queue.push(data_) ; } template <typename T> class msg_list_t { public : msg_list_t(T data_) { m_list.push_back(data_); m_excption = 0; } T pop_data() { if(0 != get_size()) { T data = m_list.front(); m_list.pop_back(); return data; } throw m_excption; } T get_first_data() { if(0 != get_size()) { return m_list.front(); } throw m_excption; } T get_last_data() { if(0 != get_size()) { return m_list.back(); } throw m_excption; } void insert_data(T c); int get_size() { return m_list.size(); } void show_data() { for(int i = 1; i <= get_size(); i++) { T data = pop_data(); cout << data << "\t"; insert_data(data); } cout << endl; } private: list <T> m_list; int m_excption; }; template <typename T> void msg_list_t<T>::insert_data(T data_) { m_list.push_back(data_) ; } template <typename T> class msg_vector_t { public : msg_vector_t(T data_) { m_vector.push_back(data_); m_excption = 0; } T pop_data() { if(0 != get_size()) { T data = m_vector.front(); m_vector.pop_back(); return data; } throw m_excption; } T get_first_data() { if(0 != get_size()) { return m_vector.front(); } throw m_excption; } T get_last_data() { if(0 != get_size()) { return m_vector.back(); } throw m_excption; } void insert_data(T c); int get_size() { return m_vector.size(); } void show_data() { for (int i = 0; i < get_size(); i++) { cout << m_vector.at(i) << "\t"; } cout << endl; } private: list <T> m_vector; int m_excption; }; template <typename T> void msg_vector_t<T>::insert_data(T data_) { m_vector.push_back(data_) ; } #endif /* MSG_H_ */
msg_queue_t<int> msg_queue_int(15); for (i = 1; i <= MOUNT; i++) { msg_queue_int.insert_data(test_int); } for (i = 1; i <= MOUNT; i++) { msg_queue_int.pop_data(); } gettimeofday(&tvEnd, NULL); long ustime_queue = (tvEnd.tv_sec - tvStart.tv_sec) * 1000000 + tvEnd.tv_usec - tvStart.tv_usec; printf("ustime_queue:\t%ld\n", ustime_queue);
結果如本文開始所述,queue的底層 是對dequeue的適配,那麼也就是分段記憶體實現儲存,這樣就不會像vector那樣需要重新分配記憶體以及複製元素的操作了,但是list是雙向連結串列,按說實現首尾的插入與刪除應該也會很快,為何也相對queue而言,很慢呢?
難道如同,我在文章開頭所引連結中所言:list的push_back的實現會導致內部使用大量動態記憶體分配,這個過程也相對耗時,所導致的結果麼,求回覆。
相關推薦
STL中queue,list,vector頻繁訪問效率
針對STL中的queue,list,vector頻繁訪問,即插入(尾部)與取出(頭部)操作時的效率進行了對比,從時間消耗上來看,queue最少,list與vector消耗相對較大,二者之間差別不大。附上類似分析一篇 :http://blog.csdn.net/lsldd/a
C++ 淺析 STL 中的 list 容器
時也 sta 雙向鏈表 class span 所有 rom 實現 -s list - 擅長插入刪除的鏈表 鏈表對於數組來說就是相反的存在。 數組本身是沒有動態增長能力的(程序中也必須又一次開辟內存來實現), 而鏈表強悍的就是動態增長和刪除的能力。 但對於數組強悍的隨機
一個程式包含C++STL中queue常見用法
下面是程式: #include <iostream> #include <queue> using namespace std; int main() { //構造一個佇列
STL中常用的vector,map,set,sort 用法
1. push_back() 在陣列的最後新增一個數據 2. pop_back() 去掉陣列的最後一個數據 3. at() 得到編號位置的資料 4. begin() 得到陣列頭的指標 5. end() 得
STL中的list/set/map等容器clear之後的記憶體佔用
最近在知乎上看到一個問題: 為什麼呼叫 std::map::clear() 後記憶體佔用率沒有降低? size很大的一個map,用完後呼叫了clear()函式,按說記憶體使用率應該能降低很多,top命令觀察,結果是記憶體使用率沒有降低,為什麼呢? 求解答,謝謝。
STL中容器list的sort方法詳解
** List 不能使用STL提供的演算法 sort() , 必須使用自己定義的sort() member function,因為STL演算法sort()只接受RamdonAccessIterator,它的實現程式碼如下,是一個quick sort; *
STL中關於list容器的sort函式詳解
寫在前面 因為在stl中stl_algo中提供有sort函式,他的函式原型: template <class RandomAccessIterator> inline void sort(RandomAccessIterator first, RandomAc
STL 中常用的 vector,map,set,sort 用法
STL中的常用的vector,map,set,sort,pair用法 C++的標準模板庫(Standard Template Library,簡稱STL)是一個容器和演算法的類庫。容器往往包
雙向連結串列(STL中的list)
List既可以像vector一樣通過"[]"運算子直接訪問特定元素,也可以用迭代器逐個訪問。另外,list還具有一項vector所不具有的特特長,那就是元素的插入與刪除操作只需要O(1)的複雜度。/* 7 insert 5 insert 2 insert 3 insert 1
STL中的vector和queue操作的區別
主要是記錄下自己的使用STL的錯誤。。 vector有以下這些功能,注意pop_bcak去掉的是最後一個元素,而queue的pop去掉的是首元素,自己經常搞混了。。 1.push_back 在陣列的最後新增一個數據 2.pop_back 去掉陣列
STL中deque,queue,stack,list的學習
(一):要點 1:容器deque的使用方法 2:容器queue,stack的使用方法 3:容器list的使用方法 (二)deque 1:deque簡介 deque是“double-ended queue”的縮寫,deque是雙端的,vector是單端
STL中vector/list的幾種賦值方法的速度比較
本文地址: http://blog.csdn.net/autophyte/archive/2008/11/08/3256096.aspx 因為工作中遇到要對比較大的vector以及list進行比較頻繁的互相複製的動作,為了提高賦值速度,所以對幾種賦值方式的耗時進行了一
STL中vector、list、deque和map的區別
map映照容器的元素資料是一個鍵值和一個映照資料組成的,鍵值與映照資料之間具有一一映照的關係。 map映照容器的資料結構是採用紅黑樹來實現的,插入鍵值的元素不允許重複,比較函式只對元素的鍵值進行比較,元素的各項資料可通過鍵值檢索出來。 使用map容器需要標頭檔案包含語句“#
3.1.3 STL中list、map、vector的使用方法
(一)list的使用方法: 程式碼: #include <iostream> #include <list> #include <algorithm> #include <numeric> #include <itera
STL中deque詳解及與vector和list的區別
在前面已經向大家介紹了vector,vector是單向開口的連續性空間,deque則是一種雙向開口的連續線性空間。所謂雙向開口,意思是可以在頭尾兩端分別作為元素的插入和刪除操作。 deque是在功能上合併了vector和list。 優點:(1) 隨機訪問方便,即支援
STL中向量vector筆記
rep 時間 pac 成員 數據位 tro num cat replace vector的本質是:數組的封裝 特點:讀取能在常數時間內完成 Vector成員函數 函數 表述 c.assign(beg,end) c.assign(n,elem) 將[
Django中的快取框架 --- 提高web的訪問效率
1、官網檢視資料 https://docs.djangoproject.com/en/2.1/topics/cache/ 2、django快取框架的特點 1、儘可能少的程式碼 2、儘可能的快 3、一致性:不同的資料儲存方式,提供一致的藉口(api)來訪問 4、擴充套件性:可以介
程式設計基礎71 STL之queue中的小問題
1056 Mice and Rice (25 分) Mice and Rice is the name of a programming contest in which each programmer must write a piece of code to control the move
C++STL中vector容器 begin()與end()函式、front()與back()
begin函式: 函式原型: iterator begin(); const_iterator begin(); 功能: 返回一個當前vector容器中起始元素的迭代器。 end函式: 函式原型: iterator end(); const_iterat
一個程式包含C++ STL中vector常見用法
廢話少說,直接上程式碼: #include <iostream> #include <vector> using namespace std; int main() { //vector的四種構造方式 //構造一個空vector vect