vector? 和 ?list? 都是C++ 標準模板庫(STL)中的容器,它們的區別如下:
?
內存結構
?
- ?vector?:是連續的內存空間,就像數組一樣,元素在內存中依次排列。
?
- ?list?:是由節點組成的雙向鏈表,每個節點包含數據和指向前一個及后一個節點的指針,節點在內存中不連續。
?
隨機訪問
?
- ?vector?:支持隨機訪問,可以通過下標快速訪問元素,時間復雜度為 O(1)。
?
- ?list?:不支持隨機訪問,要訪問某個元素,需要從鏈表頭或尾開始逐個遍歷,時間復雜度為 O(n)。
?
插入和刪除操作
?
- ?vector?:在尾部插入和刪除元素效率較高,時間復雜度為 O(1)。但在中間或頭部插入和刪除元素時,需要移動大量元素,效率較低,時間復雜度為 O(n)。
?
- ?list?:在任何位置插入和刪除元素都非常高效,只需修改相應節點的指針,時間復雜度為 O(1)。
?
迭代器
?
- ?vector?:迭代器是普通指針,支持 ?++?、?--?、?+n?、?-n? 等操作,可以直接進行算術運算來訪問不同位置的元素。
?
- ?list?:迭代器是雙向鏈表的節點指針,只支持 ?++? 和 ?--? 操作來逐個遍歷鏈表。
?
空間占用
?
- ?vector?:由于是連續內存,可能會預分配一些額外空間,以減少重新分配內存的次數,因此實際占用空間可能比存儲元素所需空間略大。
?
- ?list?:每個節點除了存儲數據外,還需要額外的空間存儲指針,所以對于大量數據,?list? 的空間占用可能比 ?vector? 大。
?
在實際應用中,如果需要頻繁隨機訪問元素,?vector? 是較好的選擇;如果需要頻繁在容器中間插入和刪除元素,?list? 更為合適。
#include <iostream>
#include <vector>
#include <list>
?
void printVector(const std::vector<int>& vec) {
? ? for (const auto& num : vec) {
? ? ? ? std::cout << num << " ";
? ? }
? ? std::cout << std::endl;
}
?
void printList(const std::list<int>& lst) {
? ? for (const auto& num : lst) {
? ? ? ? std::cout << num << " ";
? ? }
? ? std::cout << std::endl;
}
?
int main() {
? ? // vector用法示例
? ? std::vector<int> vec;
? ? // 尾部插入元素
? ? vec.push_back(1);
? ? vec.push_back(2);
? ? vec.push_back(3);
?
? ? std::cout << "Vector: ";
? ? printVector(vec);
?
? ? // 隨機訪問元素
? ? std::cout << "Element at index 1: " << vec[1] << std::endl;
?
? ? // 在中間插入元素
? ? vec.insert(vec.begin() + 1, 4);
? ? std::cout << "Vector after insertion: ";
? ? printVector(vec);
?
? ? // 刪除元素
? ? vec.erase(vec.begin() + 2);
? ? std::cout << "Vector after deletion: ";
? ? printVector(vec);
?
? ? // list用法示例
? ? std::list<int> lst;
? ? // 頭部插入元素
? ? lst.push_front(5);
? ? lst.push_front(4);
? ? lst.push_front(3);
?
? ? std::cout << "List: ";
? ? printList(lst);
?
? ? // 在中間插入元素
? ? auto it = lst.begin();
? ? std::advance(it, 1);
? ? lst.insert(it, 6);
? ? std::cout << "List after insertion: ";
? ? printList(lst);
?
? ? // 刪除元素
? ? it = lst.begin();
? ? std::advance(it, 2);
? ? lst.erase(it);
? ? std::cout << "List after deletion: ";
? ? printList(lst);
?
? ? return 0;
}
?