C++版本更新历史

news2024/11/20 4:20:04

前言

        C++语言发展至今已经迭代了很多版本,而在不同环境中编写代码时经常看到C++标准的设定,比如 Leetcode 中可以看到版本信息:

        这说明Leetcode已经支持最新C++23标准了,但某些环境并不一定支持这些语法,如果不清楚使用的语法属于哪个版本就盲目去写,将无法成功编译。本文整理了C++各个版本的常用特性方便查阅和学习。

起源

        C++ 语言的发展史可以追溯到 1979 年,当时丹麦科学家 Bjarne Stroustrup 在贝尔实验室工作,为了提高软件开发的效率和灵活性,他开始为 C 语言添加类和面向对象编程的特性。这些早期的尝试被称为 "C with Classes"。在 1983 年,Stroustrup 将这个语言重新命名为 C++,这个名字由 Rick Mascitti 提出,意在表达这是 C 语言的一个继承和扩展。

C++98

        C++98为C++语言制定了第一个官方标准,统一了不同编译器和平台之间的差异,提高了代码的可移植性和稳定性 。引入了STL,一套通用的模板库,提供了丰富的数据结构和算法。还引入了异常处理机制和命名空间的概念。

C++11

        非常重要的一次版本更新,平时用的最多的语法和特性(※)基本都是C++11时就有的。

  • 自动类型推导:引入了auto关键字,可以根据初始化表达式自动推导出变量的类型 。

auto x = 5;          // int
auto y = 5.0;        // double
auto z = "Hello";    // const char*

vector<int> v = {1, 2, 3, 4, 5};
for (auto it = v.begin(); it != v.end(); ++it) {
    cout << *it << " ";  // 使用auto推导迭代器类型
}
  • 范围for循环:引入了范围for循环的语法(元素:容器),遍历容器更简洁 。

vector<int> v = {1, 2, 3, 4, 5};
for (auto n : v) {
    cout << n << " ";  // 直接遍历容器中的元素
}
  • 智能指针:引入了智能指针,可以自动管理内存资源 。

#include <memory>
//std::unique_ptr 的设计初衷是确保资源的唯一所有权,以简化资源管理并避免内存泄漏。
//如果你需要共享资源,应该使用 std::shared_ptr。
//std:weak_ptr 用于解决shared_ptr可能导致的循环引用问题,不拥有资源,不增加引用计数。
unique_ptr<int> up(new int(10));
shared_ptr<int> sp(new int(20));
weak_ptr<int> wp = sp;
  • Lambda表达式:引入了Lambda表达式,可以方便地定义匿名函数对象 。

auto lambda = [](int x, int y) {
    return x + y;
};

cout << "Sum: " << lambda(5, 10) << endl;  // 使用Lambda表达式计算和
  • 可变参数模板:允许模板函数或模板类接受不确定数量的模板参数,但是需要手动解参数包,通常涉及到递归。

template<typename T, typename... Args>
void print(T first, Args... args) {
    cout << first << ", ";
    print(args...); // 递归调用
}
  •  并发编程支持:提供了对并发编程的支持,包括线程库、原子操作、互斥量等 。

#include <thread>
thread t([]() {
    cout << "Hello, world!" << endl;
});

t.join();  // 等待线程t完成

C++14

  • 泛型Lambda表达式:在Lambda表达式中使用auto关键字进行类型推导 。

//匿名函数更加灵活
auto add = [](auto a, auto b) { return a + b; };
cout << add(5, 3) << endl;    // 输出 8
cout << add(3.14, 2.56) << endl; // 输出 5.7
  • 变量模板:可以定义模板化的变量,使得代码更加通用和可重用 。

template<typename T>
constexpr T pi = T(3.14159265358979323846);
cout << pi<int> << endl;    // 输出 3
cout << pi<double> << endl;  // 输出 3.14159265358979323846
  • 放松的constexpr限制:允许在constexpr函数中使用更多的语言特性 。

constexpr int factorial(int n) {
    return (n <= 1) ? 1 : (n * factorial(n - 1));
}
cout << factorial(5) << endl; // 输出 120,编译时计算
  • 二进制字面量:可以方便地表示二进制数值 。

int binaryValue = 0b1101; // 表示二进制值1101,即十进制的13
cout << binaryValue << endl; // 输出 13

C++17

  • ※结构化绑定:可以方便地解构数据结构中的成员变量 。

struct Point {
    int x, y;
};

int main() {
    Point p{1, 2};
    auto [x, y] = p; // 结构化绑定,解构Point结构体
    cout << x << ", " << y << endl; // 输出 1, 2
}
  • if constexpr语句:可以在编译时进行条件判断和优化 。

template <typename T>
void doSomething(T value) {
    if constexpr (std::is_integral<T>::value) {
        cout << "T is an integral type" << endl;
    } else {
        cout << "T is not an integral type" << endl;
    }
}

int main() {
    doSomething(5);    // 编译时会选择执行is_integral分支
    doSomething(3.14); // 编译时会选择执行!is_integral分支
}
  • 折叠表达式:可以方便地对参数包进行展开和操作 。

template <typename... Args>
int sum(Args... args) {
    return (0 + ... + args); // 折叠表达式,将所有参数相加
}

int main() {
    cout << sum(1, 2, 3, 4) << endl; // 输出 10
}
  • 新增算法和数据结构:如std::variantstd::optional 。

#include <variant>
#include <optional>

std::variant<int, double, std::string> v = 42; // variant可以存储多种类型中的一个
std::optional<int> o = std::make_optional(10);  // optional用于表示可能为空的值

int main() {
    if (o) {
        cout << *o << endl; // 输出 10,如果o有值
    }

    std::visit([](auto&& arg) { cout << arg << endl; }, v); // 输出 42,使用std::visit来访问variant的值
}

C++20

  • 概念(Concepts):提供了编译时类型检查的功能 ,允许程序员定义一组约束,只有满足这些约束的类型才能作为模板参数。

template<typename T>
concept Addable = requires(T a, T b) {
    { a + b } -> std::same_as<T>;
};

template<Addable T>
T add(T a, T b) {
    return a + b;
}
  • 协程(Coroutines):实现了轻量级的协程,为编写异步代码提供了便利 。

#include <iostream>
#include <coroutine>

// 定义协程的返回对象
struct Task {
    struct promise_type {
        Task get_return_object() { return {}; }
        std::suspend_never initial_suspend() { return {}; }
        std::suspend_never final_suspend() noexcept { return {}; }
        void return_void() {}
        void unhandled_exception() {}
    };
};

Task myCoroutine() {
    // 在这里编写协程的逻辑
    std::cout << "Hello, ";
    std::coroutine::suspend_never one;
    std::coroutine::suspend_never two;
    std::coroutine::resume(one);
    std::coroutine::resume(two);
    std::cout << "World!" << std::endl;
}

int main() {
    myCoroutine();
}
  • 模块(Modules):改进了程序的单元隔离和增量编译 ,允许将代码组织成更小的、可维护的单元。模块可以提高编译速度,因为它们可以被编译器缓存和重用。

// example.cppm
export module example;
export int add(int a, int b) { return a + b; }

// main.cpp
import example;

int main() {
    int result = add(3, 5);
    return result;
}
  • 范围(Ranges):为处理序列数据提供了统一的接口 。

#include <iostream>
#include <ranges>
#include <vector>

int main() {
    std::vector<int> v = {5, 3, 9, 1, 6};

    // 使用自定义比较函数进行排序
    std::ranges::sort(v, std::greater<>{});

    for (int n : v) {
        std::cout << n << ' ';
    }
    std::cout << '\n'; // 输出排序后的向量:9 6 5 3 1
}
  • 标准库增强:添加了一些新的特性,如span ,它提供了一种轻量级的方式来表示连续内存区域的一段区间,本身不拥有它所指向的内存,只是提供了一种访问内存的方式。

C++23

C++前沿开发 - 腾讯云开发者社区


The End

参考资料

cppreference中文

现代 C 与 C++ 开发基础

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2177315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提示词工程 (Prompt Engineering) 最佳实践

prompt Engineering 概念解析 提示工程是一门较新的学科&#xff0c;关注提示词开发和优化&#xff0c;帮助用户将大语言模型&#xff08;Large Language Model, LLM&#xff09;用于各场景和研究领域。研究人员可利用提示工程来提升大语言模型处理复杂任务场景的能力&#xf…

Jetson nano (4GB版本)跑yolov8n(TensorRT 加速)网络

大家好&#xff0c;我是王硕&#xff0c;项目原因需要在Jetson nano平台上跑yolov8s &#xff0c;需要使用TensorRt加速&#xff0c;看了网上的教程&#xff0c;写的太差了&#xff0c;资料零零散散的&#xff0c;故详细介绍一下步骤。 如果想使用jetson Nano平台部署yolov8&a…

Selenium与数据库结合:数据爬取与存储的技术实践

目录 一、Selenium与数据库结合的基础概念 1.1 Selenium简介 1.2 数据库简介 1.3 Selenium与数据库结合的优势 二、Selenium爬取数据的基本步骤 2.1 环境准备 2.2 编写爬虫代码 2.3 数据提取 2.4 异常处理 三、数据存储到数据库 3.1 数据库连接 3.2 数据存储 3.3 …

windows10录屏工具,四款新手必备软件!

今天要和大家聊的是-——win10的录屏工具。在Win10电脑上&#xff0c;那些让我们爱不释手的录屏神器有很多&#xff0c;不管是哪个行业的人&#xff0c;录屏软件简直是日常工作的得力助手&#xff0c;比如说对于程序员来说&#xff0c;不管是分享代码教程、记录bug复现&#xf…

RKLLM部署

RKLLM 写在前面&#xff1a;建议去阅读官方提供的RKLLM doc&#xff0c;本文基于官方的RKLLM doc制作而成&#xff08;没有将flask相关内容添加进来&#xff09;&#xff0c;仅仅添加了完整流程的执行过程截图和在做这以流程过程中遇到的问题 RKLLM可以帮助用户快速将人工智能…

【vite】搭建完整项目流程、项目配置

文章目录 完整项目源码项目技术栈&#xff1a;项目地址&#xff1a; 一、创建项目二、安装scss三、安装路由router四、项目配置 参考文章&#xff1a;vite搭建完整项目 完整项目源码 觉得创建太麻烦就直接从github克隆吧&#xff0c;https://github.com/fruge365/vite-common…

金智维KRPA之Excel自动化

Excel自动化操作概述 Excel自动化主要用于帮助各种类型的企业用户实现Excel数据处理自动化&#xff0c;Excel自动化是可以从单元格、列、行或范围中读取数据&#xff0c;向其他电子表格或工作簿写入数据等活动。 通过相关命令&#xff0c;还可以对数据进行排序、进行格式…

开发者如何自主绑定和解除小程序和公众号长期/短期运营者微信号?

开发者如何自主绑定和解除小程序和公众号长期/短期运营者微信号&#xff1f; 1、什么是长期/短期运营者微信号&#xff1f; 为了让更多人管理公众号更方便与安全&#xff0c;每个公众号可由管理员添加绑定5个长期运营者微信号、20个短期运营者微信号&#xff0c;运营者微信号…

【sw2024】solidworks2024双击setup.exe无反应管理员运行也没反应解决方法

第一步 官网下载xxclean&#xff0c;打开xxclean最新版本&#xff0c;登录。官网xxclean.com或者自己浏览器搜。 第二步 点击扩展功能&#xff0c;点击 运行sw2024安装程序无反应 右边的开始 第三步 进度百分之百之后去双击setup就有界面了。

Tusi.Art:AI模型,comfyui工作流,一键同款!

前言 Tusi.Art&#xff1a;AI模型分享与在线运行平台的革命性体验 在当今迅速发展的AI绘图领域&#xff0c;模型的分享与应用变得尤为重要。Tusi.Art 就是这样一个平台&#xff0c;为用户提供了分享和在线运行 AI 模型的便捷服务。不仅如此&#xff0c;平台还具备强大的功能&…

现代易货交易:重塑价值交换的新趋势与未来展望“

在当今社会&#xff0c;随着经济的快速发展&#xff0c;一种新兴的交易方式——现代易货交易&#xff0c;正逐渐受到市场的青睐。这种模式不仅对传统的物品交换方式进行了现代化的改进&#xff0c;而且体现了对物品价值的重新评估和交换方法的创新。那么&#xff0c;什么是现代…

2. 将GitHub上的开源项目导入(clone)到(Linux)服务器上——深度学习·科研实践·从0到1

目录 1. 在github上搜项目 (以OpenOcc为例&#xff09; 2. 转移到码云Gitee上 3. 进入Linux服务器终端 (jupyter lab) 4. 常用Linux命令 5. 进入对应文件夹中导入项目(代码) 注意&#xff1a;系统盘和数据盘 1. 在github上搜项目 (以OpenOcc为例&#xff09; 把链接复制下…

无锡卓瓷X哲讯智能科技,SAP项目正式启动!

在数字化浪潮的推动下&#xff0c;高精密陶瓷行业的领军企业—无锡卓瓷科技有限公司&#xff0c;携手哲讯智能科技有限公司近期启动SAP&BI项目&#xff0c;以打造行业领先的数字化管理平台。这一战略举措标志着无锡卓瓷在数字化转型的道路上迈出了坚实的一步。 无锡卓瓷—…

LORA DASH -一种更高效的微调方式

LORA DASH -一种更高效的微调方式 概述 大型语言模型&#xff08;LLMs&#xff09;通过在大规模数据集上的预训练&#xff0c;能够捕捉和学习丰富的语言特征和模式。目前&#xff0c;尽管预训练模型在诸多任务上取得了显著的成果&#xff0c;但它们在特定任务上的表现仍有提升…

STM32 时钟树(基于 STM32F407)

目录 一、概述二、时钟树框图1、时钟源2、锁相环3、系统时钟4、时钟信号输出 MCO 三、时钟配置1、修改主频1.1 配置 HSE_VALUE1.2 调用 SystemInit 函数 2、STM32F4 时钟使能和配置 一、概述 STM32 内部也是由多种多样的电路模块组合在一起实现的。当一个电路越复杂&#xff0…

如何解决Google AdSense 无效流量?一文教你提高AdSense点击率

Google AdSense 点击率低得可怜&#xff1f;广告收入少得可怜&#xff1f;想知道怎么才能让 AdSense 收入飙升吗&#xff1f;如果你正遭受无效流量的困扰&#xff0c;或者你正愁着怎么提高点击率&#xff0c;那么这篇文章就是你的救星&#xff01;快和我一起往下看吧~ 一、什么…

「接口自动化测试」高频面试题!

一、json和字典的区别&#xff1f; json就是一个文本、字符串&#xff1b;有固定的格式&#xff0c;格式长的像python字典和列表的组合&#xff1b;以key-value的键值对形式来保存数据&#xff0c;结构清晰&#xff0c;。可以说是目前互联网项目开发中最常用的一种数据交互格式…

[数据集][目标检测]猪数据集VOC-2856张

数据集格式&#xff1a;Pascal VOC格式(不包含分割的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;2856 标注数量(xml文件个数)&#xff1a;2856 标注类别数&#xff1a;1 标注类别名称:["pig"] 每个类别标注的框数&#xff1a…

【YOLO目标检测输电线路异物数据集】共4516张、已标注txt格式、有训练好的yolov5的模型

目录 说明图片示例 说明 数据集格式&#xff1a;YOLO格式 图片数量&#xff1a;4516 标注数量(txt文件个数)&#xff1a;4516 标注类别数&#xff1a;4 标注类别名称&#xff1a;nest、kite、balloon、trash 数据集下载&#xff1a;输电线路异物数据集 图片示例 数据集…

华为OD机试 - 箱子之字形摆放(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;E卷D卷A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加…