std::array
:这是一个固定大小的数组容器,和原生数组类似,但具备更好的接口与安全性。它在栈上分配内存,大小在编译时确定。#include
#include
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
#include
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
#include
#include
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;
}
std::make_unique
:用于创建 std::unique_ptr
对象,提供了更简洁的方式来管理动态分配的内存。#include
#include
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;
}
auto
类型,增强了 lambda 表达式的通用性。#include
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;
}
std::optional
:表示一个可能存在的值,可用于避免返回空指针或错误码。#include
#include
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
#include
#include
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
#include
#include
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
#include
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;
}
std::span
:表示一个连续对象序列的视图,不拥有这些对象,常用于函数参数传递,避免不必要的拷贝。#include
#include
#include
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;
}
#include
#include
#include
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++ 开发者提供了更多高效、便捷的工具。