首页 >>  正文

c++容器定义

来源:baiyundou.net   日期:2024-09-22

【编者按】C++23 是 C++20 之后的下一个 C++ 标准,它包含了对 C++ 的一系列改进,但对于 C++98、C++11 或 C++20 那样具有革命性的影响力较小,更像是 C++17 的延续。

原文链接:http://modernescpp.com/index.php/c-23-the-next-c-standard

未经允许,禁止转载!

作者 | Rainer Grimm 译者 | 明明如月

编 | 夏萌出品 | CSDN(ID:CSDNnews)

C++23 将会是 C++20 后的下一个 C++ 标准。这个新标准对 C++ 进行了大幅改进,但其影响力却不如 C++98、C++11 或 C++20 那样翻天覆地。C++23 更像是 C++17 的传统延续。

为了理解 C++ 的这一进化步骤,让我们将 C++ 标准放在历史背景中来看看。

C++ 标准

C++ 已有超过 40 年的历史了。那么,在这些年里,C++ 都经历了什么变化呢?以下是一个简要的回答,一直延续到 C++23。C++98在 20 世纪 80 年代末,Bjarne Stroustrup 和 Margaret A. Ellis 合著了他们的著名书籍 Annotated C++ Reference Manual(注释版 C++ 参考手册,简称 ARM)。这些书有两个目的。首先,那时存在许多独立的 C++ 实现。因此,ARM 定义了 C++ 的功能。其次,ARM 是第一个 C++ 标准 C++98(ISO/IEC 14882)的基础。C++98 有几个关键特性:模板、包含容器和算法的标准模板库(STL)、字符串和 IO 流。C++03随着 C++03(14882:2003),C++98 得到了一项微小的技术修正,小到在我的时间线上都没有容身之地。在社区中,包括 C++98 在内的 C++03 被称为传统的 C++。TR12005 年,发生了一件令人非常兴奋的事情。这一年,发布了所谓的技术报告 1(Technical Report 1,简称 TR1)。TR1 是向着 C++11,因此向着现代 C++ 的一大步。TR1(TR 19768)是基于 C++ 标准化委员会成员创立的 boost 项目。TR1 有 13 个库,这些库也成为下一个 C++ 标准的一部分。例如,库对应到正则表达式库、随机数库、智能指针如 std::shared_ptr,以及哈希表。只有所谓的特殊数学函数需要等到 C++17 才能使用。C++11C++11 是下一个 C++ 标准,但我们通常称之为现代 C++。现代 C++ 也包括了 C++14 和 C++17。C++11 拥有许多特性,这些特性从根本上改变了我们编写 C++ 程序的方式。例如,C++11 引入了 TR1 的组件,还有移动语义、完美转发、变长模板或 `constexpr,还有其他诸多特性。随着 C++11 的到来,我们还得到了一个内存模型作为基础的线程模型,以及一个线程 API。如果你感到好奇,这里有我关于内存模型和多线程的一些基本文章。C++14C++14 是一个小型的 C++ 标准。它引入了读写锁、泛化的 lambdas 和泛化的 constexpr 函数。C++17C++17 有两个显著的特性:并行 STL 和标准化的文件系统。大约 80 个 STL 算法可以使用所谓的执行策略进行执行。这意味着 std::sort(std::execute::par, vec.begin(), vec.end()) 对 C++ 实现的排序容器 vec 是一个并行处理的提示。此外,你还可以指定排序应按顺序执行(std::execution::seq)或向量化执行(std::execution::par_unseq)。就像 C++11 一样,boost 对 C++17 也产生了深远影响。我们从 boost 获取了文件系统以及三种新的数据类型:std::optionalstd::variant std::any。这里是我关于 C++17 (链接见文底)的一些文章。C++20C++20 的变革对我们编写 C++ 程序的方式产生了根本性的影响,其程度不亚于 C++11。特别是以下四个重要特性:Ranges(范围库),Coroutines(协程),Concepts(概念),以及 Modules(模块)。新的 Ranges 库让我们可以直接在容器上表达算法,使用管道符组合算法,并将它们应用于无限数据流。多亏了 Coroutines,异步编程在 C++ 中可能会成为主流。协程是协作任务、事件循环、无限数据流或管道的基础。Concepts 将改变我们对模板的思考和编程方式。它们是有效模板参数的语义类别。它们让你能够直接在类型系统中表达你的意图。如果出了什么问题,你会收到简洁的错误信息。Modules 将克服头文件的限制。它们带来了很多好处。例如,预处理器将变得不再需要。最终,我们还将拥有更快的构建时间,更简单的包构建方式。关于 RangesCoroutinesConceptsModulesC++20 的文章可以参见链接。(链接见文底)C++23现在(2023年7月),C++23 已经完成,并进入了最终投票阶段。C++23 提供了一种小巧但影响深远的核心语言特性——this 的推导。这种特性允许你,类似于 Python,在成员函数定义中明确地传递隐式传递的 this 指针。引入 this 的推导后,一些 C++ 中复杂的技术,例如 CRTP (奇异递归模板模式) 或者 Overload Pattern(过载模式),将变得轻而易举。C++23 库还将新增很多有意思的特性。你可以直接使用 import std; 导入标准库,或者在 std::print 和 std::println 中应用 C++20 的格式字符串。此外,我们将出于性能考虑,获得如 std::flat_map 这样的扁平化关联容器,这些容器在时间和空间复杂度上做了一个平衡。std::flap_map 可取代 std::map 。std::optional 的接口将扩展为具有组合性的单子接口。新的数据类型 std::expected 已经具有可组合的接口,可以用于错误处理,存储预期值或非预期值。多亏了 std::mdspan,我们可以创建和操作多维数组。最后,std::generator 是第一个用于创建数字流的具体的协程。std::generator 是 Ranges 库的一部分,该库也将在 C++23 中得到增强。

网友:比 Python 差远了很多网友对 C++23 的改进展开了广泛讨论,很多网友对此次更新并没有感到那么兴奋。有网友表示很高兴看到 C++23 将带来 C++ 可用性的提升,但和 Python 还差很远。有网友对此甚至表示失望,他认为 C++23 和 C++ 98 相比,并没什么革命性的特性,居然还有人会为此感到兴奋。有的网友则愿意给 C++23 一个机会。他很久以来一直用 C++,但是他对 C++ 的复杂性感到不满,所以他主要用 C++11。他说现在 C++ 有了模块、概念等新特性,他开始考虑 C++23 是否值得用于新项目。他原本想用 Rust 代替 C++,但是现在他可能会给 C++23 一个机会。有网友认为 C++ 的复杂性是因为它承诺永远能够兼容旧的代码造成的。还很多网友在评论区对各种编程语言进行了讨论。有网友认为,问题并不是出在语言本身,而取决于你用它来实现什么样的功能。例如,如果你想使用虚幻引擎或编写音频插件,就学习 C++。如果你想玩机器学习,就学好Python。如果你想制作移动应用程序,就学习 Swift 或 Kotlin。你对 C++23 的改进有何看法?欢迎在评论区交流讨论。参考链接1、 Annotated C++ Reference Manual:http://www.stroustrup.com/arm.html2、 boost 项目:https://www.boost.org/3、内存模型:https://www.modernescpp.com/index.php/category/multithreading-memory-model4、多线程:https://www.modernescpp.com/index.php/category/multithreading5、 C++17:https://www.modernescpp.com/index.php/category/c-176、 Ranges:https://www.modernescpp.com/index.php/tag/ranges-library7、Coroutines:https://www.modernescpp.com/index.php/tag/coroutines8、Concepts:https://www.modernescpp.com/index.php/tag/concepts9、Modules:https://www.modernescpp.com/index.php/tag/modules10、C++20:https://www.modernescpp.com/index.php/category/c-20

","gnid":"9ce8d025fc7905a89","img_data":[{"flag":2,"img":[{"desc":"","height":"80","s_url":"https://p0.ssl.img.360kuai.com/t0160bfdc18dd41df77_1.gif","title":"","url":"https://p0.ssl.img.360kuai.com/t0160bfdc18dd41df77.gif","width":"640"},{"desc":"","height":"352","title":"","url":"https://p0.ssl.img.360kuai.com/t019bf2c281c6631663.jpg","width":"1080"}]}],"original":0,"pat":"art_src_1,fts0,sts0","powerby":"hbase","pub_time":1689320946000,"pure":"","rawurl":"http://zm.news.so.com/94c00d0aa3a0b0527651651f57332cd7","redirect":0,"rptid":"e0443187072820cc","rss_ext":[],"s":"t","src":"CSDN","tag":[],"title":"C++23:下一个 C++ 标准

暨旺爬3078c++中存放对象的容器怎么定义? -
万仲庭19564099533 ______ vector aa; 应该这样定义,但你定义的Point类必须要有默认构造函数...

暨旺爬3078C++容器类是什么意思? -
万仲庭19564099533 ______ 容器,就是能装其它东西的东西.(貌似很绕嘴)类,这是C++的基本概念,不解释了.容器类就是写一个类,它的作用是个容器.C++ STL中提供很多容器类,比如Vector,Set,Map,Pair,List等等.这些...

暨旺爬3078什么是容器类型? -
万仲庭19564099533 ______ 容器就是用来存放数据的载具,c++有许多容器类型,如vector,map,bitset等,就象在C中你创建一个一个字符串,他就是一个数组,这个数组我们可以形象的称它为容器,用来存放字符串的容器(当然c++中的容器不是这么简单).

暨旺爬3078VC++ 中的容器都有哪些,具体是干什么用的.
万仲庭19564099533 ______ STL容器是一组类模版 ,分为顺序容器、适配器容器、关联容器. vector向量容器 连续存储元素 list表容器 deque双端队列 stack 栈(适配器) 后进先出序列 queue 队列 (适配器) 先进先出序列 set 集合 multiset 可重复集合 map 映射 multimap 可重复映射 具体的还是你自己亲自百度一下吧,那样记得牢.

暨旺爬3078c++中的容器包括哪些? -
万仲庭19564099533 ______ 1、vector 连续存储结构,每个元素在内存上是连续的; 支持高效的随机访问和在尾端插入/删除操作,但其他位置的插入/删除操作效率低下; 2、deque 连续存储结构,即其每个元素在内存上也是连续的,类似于vector,不同之处在于,deque...

暨旺爬3078C++的一级容器是指那些? -
万仲庭19564099533 ______ 指线性存储容器,例如vector. stack. ......

暨旺爬3078请问C++里interator是什么 -
万仲庭19564099533 ______ iterator吧?stl类库中经常使用这个标示符标示迭代器类型,用来线性访问一个集合对象中的每个元素.

暨旺爬3078C++ 容器中 键 值分别是什么意思? -
万仲庭19564099533 ______ 程序源代码如下:main() { int i,j,k; printf("\n"); for(i=1;i for(j=1;j for (k=1;k { if (i!=k&&i!=j&&j!=k) /*确保i、j、k三位互不相同*/ printf("%d,%d,%d\n",i,j,k); } } main() { long int i; int bonus1,bonus2,bonus4,bonus6,bonus10,bonus; scanf(...

暨旺爬3078C++里面VECTOR有啥作用.和数组区别在哪
万仲庭19564099533 ______ 这个问题好,我来回答吧,当是复习下.vector是c++标准库中定义的类型,是容器的一种.标准库中容器有很多种,vector只是最基本的一种,vector类型和数组类型的基本功能都是一样的,就是存储同类元素,但是他与数组最大的区别就是可...

暨旺爬3078分配器的介绍 -
万仲庭19564099533 ______ 在C++编程中,分配器(英语:allocator)是C++标准库的重要组成部分.C++的库中定义了多种被统称为“容器”的数据结构(如链表、集合等),这些容器的共同特征之一,即是其大小可以在程序的运行时改变;为了实现这一点,进行动态...

(编辑:自媒体)
关于我们 | 客户服务 | 服务条款 | 联系我们 | 免责声明 | 网站地图 @ 白云都 2024