文章目錄
- C++11 中的 STL 新增內容
- 容器
- 算法
- C++14 中的 STL 新增內容
- 容器
- 算法
- C++17 中的 STL 新增內容
- 容器
- 算法
- C++20 中的 STL 新增內容
- 容器
- 算法
C++11 中的 STL 新增內容
容器
std::array
:這是一個固定大小的數組容器,和原生數組類似,但具備更好的接口與安全性。它在棧上分配內存,大小在編譯時確定。
#include <array>
#include <iostream>
int main() {std::array<int, 5> arr = {1, 2, 3, 4, 5};for (int num : arr) {std::cout << num << " ";}return 0;
}
std::unordered_set
和std::unordered_map
:這兩個容器分別是std::set
和std::map
的無序版本。它們采用哈希表實現,查找、插入和刪除操作的平均時間復雜度為 O ( 1 ) O(1) O(1)。
#include <unordered_set>
#include <iostream>
int main() {std::unordered_set<int> us = {1, 2, 3};for (int num : us) {std::cout << num << " ";}return 0;
}
std::forward_list
:這是一個單向鏈表容器,相比于std::list
(雙向鏈表),它占用的空間更少,插入和刪除操作更快。
算法
std::all_of
、std::any_of
和std::none_of
:這些算法用于檢查范圍中的元素是否滿足特定條件。
#include <algorithm>
#include <vector>
#include <iostream>
int main() {std::vector<int> vec = {1, 2, 3, 4, 5};bool all_positive = std::all_of(vec.begin(), vec.end(), [](int i) { return i > 0; });std::cout << (all_positive ? "All positive" : "Not all positive") << std::endl;return 0;
}
C++14 中的 STL 新增內容
容器
std::make_unique
:用于創建std::unique_ptr
對象,提供了更簡潔的方式來管理動態分配的內存。
#include <memory>
#include <iostream>
class MyClass {
public:MyClass() { std::cout << "Constructed" << std::endl; }~MyClass() { std::cout << "Destroyed" << std::endl; }
};
int main() {auto ptr = std::make_unique<MyClass>();return 0;
}
算法
- 泛型 lambda 表達式:允許 lambda 表達式的參數使用
auto
類型,增強了 lambda 表達式的通用性。
#include <iostream>
int main() {auto add = [](auto a, auto b) { return a + b; };std::cout << add(1, 2) << std::endl;std::cout << add(1.5, 2.5) << std::endl;return 0;
}
C++17 中的 STL 新增內容
容器
std::optional
:表示一個可能存在的值,可用于避免返回空指針或錯誤碼。
#include <optional>
#include <iostream>
std::optional<int> divide(int a, int b) {if (b == 0) {return std::nullopt;}return a / b;
}
int main() {auto result = divide(10, 2);if (result) {std::cout << "Result: " << *result << std::endl;} else {std::cout << "Division by zero" << std::endl;}return 0;
}
std::variant
:可以存儲多種不同類型的值,但同一時間只能存儲其中一種類型。
#include <variant>
#include <iostream>
#include <string>
int main() {std::variant<int, std::string> var = 10;std::cout << std::get<int>(var) << std::endl;var = "Hello";std::cout << std::get<std::string>(var) << std::endl;return 0;
}
std::any
:可以存儲任意類型的值。
#include <any>
#include <iostream>
#include <string>
int main() {std::any value = 10;std::cout << std::any_cast<int>(value) << std::endl;value = std::string("Hello");std::cout << std::any_cast<std::string>(value) << std::endl;return 0;
}
算法
std::clamp
:用于將一個值限制在指定的范圍內。
#include <algorithm>
#include <iostream>
int main() {int value = 15;int min = 10;int max = 20;int result = std::clamp(value, min, max);std::cout << "Clamped value: " << result << std::endl;return 0;
}
C++20 中的 STL 新增內容
容器
std::span
:表示一個連續對象序列的視圖,不擁有這些對象,常用于函數參數傳遞,避免不必要的拷貝。
#include <span>
#include <iostream>
#include <vector>
void print(std::span<int> sp) {for (int num : sp) {std::cout << num << " ";}std::cout << std::endl;
}
int main() {std::vector<int> vec = {1, 2, 3, 4, 5};print(vec);return 0;
}
算法
- 范圍庫(Ranges Library):提供了一種更簡潔、更通用的方式來處理序列數據,結合了算法和迭代器的功能。
#include <iostream>
#include <vector>
#include <ranges>
int main() {std::vector<int> vec = {1, 2, 3, 4, 5};auto even_numbers = vec | std::views::filter([](int i) { return i % 2 == 0; });for (int num : even_numbers) {std::cout << num << " ";}return 0;
}
這些新增內容使得 STL 更加完善和強大,為 C++ 開發者提供了更多高效、便捷的工具。