我想把三個常用的序列式放在一起對比一下是有必要的:
vector : vector和built-in數組類似,擁有一段連續的內存空間,能非常好的支持隨即存取,即[]操作符,但由於它的內存空間是連續的,所以在中間進行插入和刪除會造成內存塊的拷貝,另外,當插入較多的元素后,預留內存空間可能不夠,需要重新申請一塊足夠大的內存並把原來的數據拷貝到新的內存空間。這些影響了vector的效率,但是實際上用的最多的還是vector容器,建議大多數時候使用vector效率一般是不錯的
list: list就是數據結構中的雙向鏈表(根據sgi stl源代碼),因此它的內存空間是不連續的,通過指針來進行數據的訪問,這個特點使得它的隨即存取變的非常沒有效率,因此它沒有提供[]操作符的重載。但由於鏈表的特點,它可以以很好的效率支持任意地方的刪除和插入。
deque: deque是一個double-ended queue,它的具體實現不太清楚,但知道它具有以下兩個特點:它支持[]操作符,也就是支持隨即存取,並且和vector的效率相差無幾,它支持在兩端的操作:push_back,push_front,pop_back,pop_front等,並且在兩端操作上與list的效率也差不多。
因此在實際使用時,如何選擇這三個容器中哪一個,應根據你的需要而定,具體可以遵循下面的原則:
1. 如果你需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector
2. 如果你需要大量的插入和刪除,而不關心隨即存取,則應使用list
3. 如果你需要隨即存取,而且關心兩端數據的插入和刪除,則應使用deque。
#include<iostream> #include <list> int main() { std::list<int> l1; //聲明一個空列表 std::list<int> l2(5); //聲明一個有n個元素的列表,每個元素都是由其默認構造函數T()構造出來的 std::list<int> l3(3, 0); //創建含有3個元素的list,值都是0 std::list<int> l4(l2); //使用l2初始化l4 std::list<int> l5(l2.begin(), l2.end()); //同l4 return 0; }
#include<iostream> #include <list> int main() { std::list<int> L; for (int i = 0; i < 5; ++i) { L.push_back(i+10); //在list的末尾添加一個元素 } std::list<int>::iterator iter; //創建迭代器 int x=L.front(); //返回第一個元素 std::cout << x << std::endl; x = L.back(); //返回最后一個元素 std::cout << x << std::endl; bool b = L.empty(); //判斷是否為空 //如果空 返回真 std::cout << b << std::endl; L.insert(L.begin(), 100); //在L的開始位置插入100 L.insert(L.begin(),2, 200); //在L的開始位置插入2個200 //l1.insert(l1.begin(), l2.begin(), l2.end()); 在l1的開始位置插入l2的從開始到結束的所有位置的元素 L.erase(L.begin()); //將L的第一個元素刪除 //L.erase(L.begin(), L.end()); //將L的從begin()到end()之間的元素刪除 //L.clear(); // 清空list中的所有元素 L.push_front(1000);//在L的頭部位置插入數據 L.pop_front(); // 刪除第一個元素,序列必須不為空 L.pop_back(); // 刪除最后一個元素,序列必須不為空 L.reverse(); //倒序 for (iter = L.begin(); iter != L.end(); iter++) /* L.begin()返回第一個元素的迭代器 L.end() 返回最后一個元素的下一位置的迭代器 */ { std::cout << *iter << " "; // *iter 返回指定迭代器的數據 } std::cout << std::endl; //l1.assign(n, val)將 l1中元素變為n個T(val) //l1.assign(l2.begin(),l2.end())將l2中的從l2.begin()到l2.end()之間的數值賦值給l1 //swap():交換兩個表(兩個重載),一個是l1.swap(l2); 另外一個是swap(l1,l2),都可能完成連個鏈表的交換 //l1.merge(l2,greater<int>()); 合並兩個表,調用結束后l2變為空,l1中元素包含原來l1 和 l2中的元素,並且排好序,升序,其實默認是升序,greater<int>()可以省略 return 0; }