STL新增内容
文章目录
- 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++ 开发者提供了更多高效、便捷的工具。