vector和陣列類似,它擁有一段連續的記憶體空間,並且起始位址不變,因此它能非常好的支援隨機訪問(即使用操作符訪問其中的元素),但由於它的記憶體空間是連續的,所以在中間進行插入和刪除會造成記憶體塊的拷貝(複雜度是o(n)),另外,當該陣列後的記憶體空間不夠時,需要重新申請一塊足夠大的記憶體並進行記憶體的拷貝。這些都大大影響了vector的效率。
list是由資料結構中的雙向鍊錶實現的,因此它的記憶體空間可以是不連續的。因此只能通過指標來進行資料的訪問,這個特點使得它的隨機訪問變的非常沒有效率,需要遍歷中間的元素,搜尋複雜度o(n),因此它沒有提供操作符的過載。但由於鍊錶的特點,它可以以很好的效率支援任意地方的刪除和插入。
由於list和vector上面的這些區別,因此list::iterator與vector::iterator也有一些不同。請看下面的例子:
#include #include using namespace std;
int main( void )
cout << "v[2] = " << v[2] << endl;
//cout << "l[2] = " << l[2] << endl; //編譯錯誤,list沒有過載
cout << (v.begin() < v.end()) << endl;
//cout << (l.begin() < l.end()) << endl; //編譯錯誤,list::iterator沒有過載《或》
cout << *(v.begin() + 1) << endl;
vector::iterator itv = v.begin();
list::iterator itl = l.begin();
itv = itv + 2;
//itl = itl + 2; //編譯錯誤,list::iterator沒有過載+
itl++;
itl++; //list::iterator中過載了++,只能使用++進行迭代訪問。
cout << *itv << endl;
cout << *itl << endl;
return 0;
由於vector擁有一段連續的記憶體空間,能非常好的支援隨機訪問,因此vector::iterator支援「+」、「+=」、「<」等操作符。
而list的記憶體空間可以是不連續,它不支援隨機訪問,因此list::iterator則不支援「+」、「+=」、「<」等操作符運算,因此**20、26行會有編譯錯誤。只能使用「++」進行迭代,例如**27行,使用兩次itl++來移動itl。還有list也不支援運算子,因此**18行出現編譯錯誤。
總之,如果需要高效的隨即訪問,而不在乎插入和刪除的效率,使用vector;如果需要大量的插入和刪除,而不關心隨即訪問,則應使用list。
答案:vector擁有一段連續的記憶體空間,因此支援隨機訪問,如果需要高效的隨即訪問,而不在乎插入和刪除的效率,使用vector。
list擁有一段不連續的記憶體空間,因此支援隨機訪問,如果需要大量的插入和刪除,而不關心隨即訪問,則應使用list。
轉
vector 和vector 有什麼區別?
圓括號 vectorv n 圓括號是建構函式,表示1個容量為n的vector 方括號vectorv n 表示n個vectorv 二維陣列 相當於vector v n 二維陣列 舉例vector v 10 表示 乙個容量 10的vector vector v 10 表示10個容量不確定的vector組...
C 容器中列表list和向量vector區別
關於容器 容器是可以用於存放各種型別的資料的資料結構 如 vectorv1 c 標準模板庫 stl 提供三類容器 1 順序容器,如vector,list,deque 雙端佇列 等 2 關聯容器,如set 集合 multiset 多重集合 map 對映 multimap 多重對映 等 3 容器介面卡,...
atomic 和 nonatomic 有什麼區別
atomic 和 nonatomic 的區別在於,系統自動生成的 getter setter 方法不一樣。atomic 變數預設是有該有屬性的,這個屬性是為了保證在多執行緒的情況下,編譯器會自動生成一些互斥加鎖的 避免該變數的讀寫不同步的問題。nonatomic 如果該物件無需考慮多執行緒的情況,這...