1. 程式人生 > >STL中queue,list,vector頻繁訪問效率

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的實現會導致內部使用大量動態記憶體分配,這個過程也相對耗時,所導致的結果麼,求回覆。

相關推薦

STLqueue,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++STLqueue常見用法

下面是程式: #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()             得

STLlist/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)是一個容器和演算法的類庫。容器往往包

雙向連結串列(STLlist

List既可以像vector一樣通過"[]"運算子直接訪問特定元素,也可以用迭代器逐個訪問。另外,list還具有一項vector所不具有的特特長,那就是元素的插入與刪除操作只需要O(1)的複雜度。/* 7 insert 5 insert 2 insert 3 insert 1

STLvectorqueue操作的區別

主要是記錄下自己的使用STL的錯誤。。 vector有以下這些功能,注意pop_bcak去掉的是最後一個元素,而queue的pop去掉的是首元素,自己經常搞混了。。 1.push_back 在陣列的最後新增一個數據 2.pop_back 去掉陣列

STLdeque,queue,stack,list的學習

(一):要點 1:容器deque的使用方法 2:容器queue,stack的使用方法 3:容器list的使用方法 (二)deque 1:deque簡介 deque是“double-ended queue”的縮寫,deque是雙端的,vector是單端

STLvector/list的幾種賦值方法的速度比較

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

STLvectorlist、deque和map的區別

map映照容器的元素資料是一個鍵值和一個映照資料組成的,鍵值與映照資料之間具有一一映照的關係。         map映照容器的資料結構是採用紅黑樹來實現的,插入鍵值的元素不允許重複,比較函式只對元素的鍵值進行比較,元素的各項資料可通過鍵值檢索出來。         使用map容器需要標頭檔案包含語句“#

3.1.3 STLlist、map、vector的使用方法

(一)list的使用方法: 程式碼: #include <iostream> #include <list> #include <algorithm> #include <numeric> #include <itera

STLdeque詳解及與vectorlist的區別

在前面已經向大家介紹了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 STLqueue的小問題

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++STLvector容器 begin()與end()函式、front()與back()

begin函式: 函式原型: iterator begin(); const_iterator begin(); 功能: 返回一個當前vector容器中起始元素的迭代器。 end函式: 函式原型: iterator end(); const_iterat

一個程式包含C++ STLvector常見用法

廢話少說,直接上程式碼:  #include <iostream> #include <vector> using namespace std; int main() { //vector的四種構造方式 //構造一個空vector vect