当前位置: 首页 > news >正文

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_setstd::unordered_map:这两个容器分别是 std::setstd::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_ofstd::any_ofstd::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++ 开发者提供了更多高效、便捷的工具。

相关文章:

  • flutter 曲线学习 使用第三方插件实现左右滑动
  • 厘米级定位赋能智造升级:品铂科技UWB技术驱动工厂全流程自动化与效能跃升”
  • Boost库中的谓词函数
  • 基于大模型的室间隔缺损手术全流程预测与方案研究报告
  • 蹊跷的崩溃:CoreData 数据保存时提示“不可接受类型”(Unacceptable type)
  • k8s常用总结
  • C++刷题(四):vector
  • 没有数据湖?可观测性也许不再有效!
  • 透视飞鹤2024财报:如何打赢奶粉罐里的科技战?
  • deepseek对IBM MQ错误日志分析
  • java项目挂机自动重启操作指南
  • STM32八股【5】----- TIM定时器
  • 堆叠虚拟化2
  • 界面自适应new 使用postcss-pxtorem
  • FreeRTOS 知识点总结(二):同步机制与应用场景
  • 如何在JMeter中配置断言,将非200状态码视为测试成功
  • java 洛谷题单【数据结构1-4】图的基本应用
  • 15:00开始面试,15:08就出来了,问的问题有点变态。。。
  • 射频功率放大器保护电路简略
  • 消息中间件对比与选型指南:Kafka、ActiveMQ、RabbitMQ与RocketMQ
  • 莫高义在第四届中国新闻发言人论坛开幕式上的致辞
  • 小米汽车回应部分SU7前保险杠形变
  • 气急败坏!20多名台湾艺人被台当局列为“重点核查对象”
  • 61岁云浮市律师协会副会长谭炳光因突发疾病逝世
  • 用贝多芬八首钢琴三重奏纪念风雨并肩20年
  • 著名心血管病学专家李国庆教授逝世,享年63岁