C++面试题:list和vector有什么区别
C++面試題:list和vector有什么區(qū)別?
考點:理解list和vector的區(qū)別
出現(xiàn)頻率:★★★★
解析:
vector和數(shù)組類似,它擁有一段連續(xù)的內(nèi)存空間,并且起始地址不變,因此它能非常好的支持隨機存取(即使用[]操作符訪問其中的元素),但由于它的內(nèi)存空間是連續(xù)的,所以在中間進行插入和刪除會造成內(nèi)存塊的拷貝(復(fù)雜度是O(n)),另外,當(dāng)該數(shù)組后的內(nèi)存空間不夠時,需要重新申請一塊足夠大的內(nèi)存并進行內(nèi)存的拷貝。這些都大大影響了vector的效率。
list是由數(shù)據(jù)結(jié)構(gòu)中的雙向鏈表實現(xiàn)的,因此它的內(nèi)存空間可以是不連續(xù)的。因此只能通過指針來進行數(shù)據(jù)的訪問,這個特點使得它的隨機存取變的非常沒有效率,需要遍歷中間的元素,搜索復(fù)雜度O(n),因此它沒有提供[]操作符的重載。但由于鏈表的特點,它可以以很好的效率支持任意地方的刪除和插入。
由于list和vector上面的這些區(qū)別,因此list::iterator與vector::iterator也有一些不同。請看下面的例子:
? ?? ???#include <iostream>
? ?? ???#include <vector>
? ?? ???#include <list>
? ?? ???using namespace std;
? ?? ???
? ?? ???int main( void )
? ?? ???{
? ?? ?? ?? ?? ? vector<int> v;?
? ?? ?? ?? ?? ? list<int> l;
? ?? ?? ?? ?? ??
? ?? ?? ?? ?? ? for (int i=0; i<8; i++)? ???//往v和l中分別添加元素
? ?? ?? ?? ?? ? {
? ?? ?? ?? ?? ?? ?? ?? ?v.push_back(i);
? ?? ?? ?? ?? ?? ?? ?? ?l.push_back(i);
? ?? ?? ?? ?? ? }
? ?? ?? ?? ?? ??
? ?? ?? ?? ?? ? 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<int>::iterator itv = v.begin();
? ?? ?? ?? ?? ? list<int>::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擁有一段連續(xù)的內(nèi)存空間,能非常好的支持隨機存取,因此vector<int>::iterator支持“+”、“+=”、“<”等操作符。
而list的內(nèi)存空間可以是不連續(xù),它不支持隨機訪問,因此list<int>::iterator則不支持“+”、“+=”、“<”等操作符運算,因此代碼20、26行會有編譯錯誤。只能使用“++”進行迭代,例如代碼27行,使用兩次itl++來移動itl。還有l(wèi)ist也不支持[]運算符,因此代碼18行出現(xiàn)編譯錯誤。
總之,如果需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector;如果需要大量的插入和刪除,而不關(guān)心隨即存取,則應(yīng)使用list。
答案:
vector擁有一段連續(xù)的內(nèi)存空間,因此支持隨機存取,如果需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector。
list擁有一段不連續(xù)的內(nèi)存空間,因此支持隨機存取,如果需要大量的插入和刪除,而不關(guān)心隨即存取,則應(yīng)使用list。
轉(zhuǎn)載于:https://www.cnblogs.com/wuchanming/p/3728447.html
總結(jié)
以上是生活随笔為你收集整理的C++面试题:list和vector有什么区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode OJ - Copy L
- 下一篇: [转]Cookie/Session机制详