STL新增内容

文章目录

      • C++11 中的 STL 新增内容
        • 容器
        • 算法
      • C++14 中的 STL 新增内容
        • 容器
        • 算法
      • C++17 中的 STL 新增内容
        • 容器
        • 算法
      • C++20 中的 STL 新增内容
        • 容器
        • 算法

C++11 中的 STL 新增内容

容器
  • 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_setstd::unordered_map:这两个容器分别是 std::setstd::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_ofstd::any_ofstd::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;
}

C++14 中的 STL 新增内容

容器
  • 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;
}
算法
  • 泛型 lambda 表达式:允许 lambda 表达式的参数使用 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;
}

C++17 中的 STL 新增内容

容器
  • 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;
}

C++20 中的 STL 新增内容

容器
  • 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;
}
算法
  • 范围库(Ranges Library):提供了一种更简洁、更通用的方式来处理序列数据,结合了算法和迭代器的功能。
#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++ 开发者提供了更多高效、便捷的工具。

你可能感兴趣的:(【道阻且长C++】,【C++,STL】,c++,算法,开发语言)