一.總體介紹
STL(Standard Template Library)是C++標準模板庫,提供了一系列的通用模板類和函數,用于實現常見的數據結構和算法,方便開發者快速地實現各種功能。STL包括了容器(Containers)、算法(Algorithms)和迭代器(Iterators)三個組件。
STL容器是STL中最重要的部分之一,提供了各種不同類型的數據結構,包括序列容器(如vector、list、deque等)、關聯容器(如set、map、multiset、multimap等)和容器適配器(如stack、queue、priority_queue等)。每種容器都有不同的特點和適用場景,開發者可以根據具體需求選擇合適的容器。
以下是STL中常用的容器及其簡要介紹:
- vector:動態數組,支持隨機訪問和動態增刪元素,適用于需要頻繁訪問元素的情況。
- list:雙向鏈表,支持快速插入和刪除元素,適用于頻繁插入和刪除元素的情況。
- deque:雙端隊列,支持在兩端進行插入和刪除操作,適用于需要在兩端進行頻繁插入和刪除操作的情況。
- set/multiset:集合,元素按照一定規則排序,且元素不重復,適用于需要快速查找和去重的情況。
- map/multimap:映射,鍵值對存儲,適用于需要快速查找和鍵值對存儲的情況。
- stack:棧,后進先出的數據結構,適用于需要后進先出的情況。
- queue:隊列,先進先出的數據結構,適用于需要先進先出的情況。
- priority_queue:優先隊列,按照一定規則排序,每次取出的元素為最優先元素,適用于需要按照優先級取出元素的情況。
在選擇STL容器時,需要根據具體的需求和情況進行選擇,考慮以下因素:
- 數據結構特點:不同的容器有不同的特點和適用場景,需要根據需求選擇合適的數據結構。
- 操作復雜度:不同的容器對于不同的操作有不同的時間復雜度,需要根據具體操作的頻率選擇合適的容器。
- 內存占用:不同的容器在內存占用上也有不同,需要根據內存占用的要求選擇合適的容器。
總的來說,STL容器提供了豐富的選擇,開發者可以根據具體需求選擇合適的容器,以實現高效的數據結構和算法。
二.使用方法?
1.vector
#include <vector>
#include <iostream>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};for (int i = 0; i < vec.size(); i++) {std::cout << vec[i] << " ";}return 0;
}
2.list?
#include <list>
#include <iostream>int main() {std::list<int> myList = {1, 2, 3, 4, 5};myList.push_back(6);myList.push_front(0);for (auto it = myList.begin(); it != myList.end(); it++) {std::cout << *it << " ";}return 0;
}
?3.deque
#include <deque>
#include <iostream>int main() {std::deque<int> myDeque = {1, 2, 3, 4, 5};myDeque.push_back(6);myDeque.push_front(0);for (int i = 0; i < myDeque.size(); i++) {std::cout << myDeque[i] << " ";}return 0;
}
4.set
#include <set>
#include <iostream>int main() {std::set<int> mySet = {3, 1, 4, 1, 5, 9};for (auto it = mySet.begin(); it != mySet.end(); it++) {std::cout << *it << " ";}return 0;
}
5.map
#include <map>
#include <iostream>int main() {std::map<std::string, int> myMap = {{"Alice", 25}, {"Bob", 30}, {"Charlie", 35}};for (auto it = myMap.begin(); it != myMap.end(); it++) {std::cout << it->first << ": " << it->second << std::endl;}return 0;
}
?6.stack
#include <stack>
#include <iostream>int main() {std::stack<int> myStack;myStack.push(1);myStack.push(2);myStack.push(3);while (!myStack.empty()) {std::cout << myStack.top() << " ";myStack.pop();}return 0;
}
?7.queue
#include <queue>
#include <iostream>int main() {std::queue<int> myQueue;myQueue.push(1);myQueue.push(2);myQueue.push(3);while (!myQueue.empty()) {std::cout << myQueue.front() << " ";myQueue.pop();}return 0;
}
三.優先隊列介紹?
priority_queue
?是一個優先隊列容器,它基于堆數據結構實現,可以保證在插入和刪除元素時,始終保持隊列中的元素按照一定的優先級順序排列。在?priority_queue
?中,最優先的元素始終位于隊列的頂部,可以通過?top()
?方法獲取最優先的元素。
priority_queue
?提供了一些常用的操作,如插入元素?push()
、刪除最優先元素?pop()
、獲取最優先元素?top()
?等。在?priority_queue
?中,元素的優先級由比較函數或者元素類型的?<
?操作符決定。以下是?
priority_queue
?的一些重要特點和注意事項:
- 默認情況下,
priority_queue
?是一個最大堆,即最大的元素位于隊列的頂部。- 可以通過指定比較函數或者使用自定義的元素類型重載?
<
?操作符來實現最小堆。priority_queue
?不支持遍歷操作,只能通過?top()
?方法獲取最優先元素,然后通過?pop()
?方法刪除該元素。- 插入和刪除操作的時間復雜度為 O(log n),獲取最優先元素的時間復雜度為 O(1)。
示例:
#include <queue>
#include <iostream>int main() {std::priority_queue<int> myPriorityQueue;myPriorityQueue.push(3);myPriorityQueue.push(1);myPriorityQueue.push(5);while (!myPriorityQueue.empty()) {std::cout << myPriorityQueue.top() << " ";myPriorityQueue.pop();}return 0;
}
?在上面的示例中,我們創建了一個?
priority_queue
,并依次插入了元素 3、1、5。然后通過循環獲取最優先元素并輸出,最終輸出結果為 5、3、1。