现代C++之容器 本节将深入学习现代C++实战30讲中的第4节与第5节容器所提到的内容。正文中的一些文字直接引用自上面。 跳出 C++ 的语境,map(映射)的更常见的名字是关联数组和字典 ,而在 JSON 里直接被称为对象(object)。在 C++ 外这些容器常常是无序的;在 C++ 里关联容器则被认为是有序的。 7.array C 数组在 C++ 里继续存在,主要是为了保留和 C 的向后兼容性。 C 数组本身和 C++ 的容器相差是非常大的: C 数组没有 begin 和 end 成员函数(虽然可以使用全局的begin 和 end 函数) C 数组没有 size 成员函数(得用一些模板技巧来获取其长度 如果数组大小固定(C 的数组在 C++ 里本来就是大小固定的)并且较小的话,应该考虑 array。
Koenig查找或参数依赖查找描述了C ++编译器如何查找不合格的名称 。简单来说:如果在函数的名称空间中定义了一种或多种参数类型,则不必为函数限定名称空间。
现代C++之constexpr constexpr在 C++11 引入、在 C++14 得到大幅改进。 x.getvalue() is constexpr and can be evaluated at compile time. 4.建议 Tips from the book Effective Modern C+ 这种区别在你用 & 去取一个 const int 值的地址、或将其传到一个形参类型为 const int& 的函数去的时候(这在 C++ 文档里的行话叫 ODR-use),就会体现出来。 6.学习资料 https://stackoverflow.com/questions/14116003/difference-between-constexpr-and-const 极客时间现代C++
介绍c++的SFINAE概念:类成员的编译时内省 0.导语1.C++自省? 对于那些卡在c++ 11和c++ 14之间的人来说,这也很有趣。 c++ 98中的解决方案依赖于3个关键概念:重载解析、SFINAE和sizeof的静态行为。 虽然这个特性不是c++ 98标准所要求的,但是它已经在使用了,这取决于您的编译器。它确实成为c++ 11中一个安全的选择。 auto在c++ 11中也有一个不太出名的函数声明用法。 毕竟我们是在用c++编程,而不是OCaml lambda (2)函数爱好者的功能 c++ 11介绍了lambda。
学习C++的朋友会遇到这样的问题,有char,int,double等对象,我们想把它们打印出来看看,初学者会通过cout或者传统C语言的printf函数来打印这些对象。
现代 C++ (本书中均指 C++11/14/17/20) 为传统 C++ 注入的大量特性使得整个 C++ 变得更加像一门现代化的语言。 C++17 则是近三年依赖 C++ 社区一致推进的方向,也指出了**现代C++**编程的一个重要发展方向。 换句话说,那些长期使用传统 C++ 进行编码的人、渴望在短时间内迅速了解现代 C++ 特性的人非常适合阅读本书; 本书一定程度上介绍了一些现代 C++ 的黑魔法,但这些魔法毕竟有限,不适合希望进阶学习现代 C++ 的读者,本书的定位系现代 C++ 的快速上手。 也算是笔者为推进现代 C++ 的普及贡献了一些绵薄之力。
自动类型推导 现代的编程语言,不管是动态语言(JavaScript、Python 等),还是静态语言(Go、Rust 等),大都支持自动类型推导(type deduction)。 auto 我们来看看 auto 关键字在 C++ 中的使用。 最简单的用法,定义变量的时候不指定类型,通过初始化的值让编译器自动推导。 来解决这个问题: template<typename T, typename U> auto Plus(T t, U u) -> decltype(t + u) { return t + u; } C+
从 C++11 开始,C++ 有三种方式可以创建/传递一个可以被调用的对象: 函数指针 仿函数(Functor) Lambda 表达式 函数指针 函数指针是从 C 语言老祖宗继承下来的东西,比较原始,功能也比较弱 int id; std::string title; double price; }; std::vector<Book> books; std::string target = "C+ +"; // 找出其中 title 包含“C++”的书本的数量 Lambda 表达式的最基本的两种捕获方式是:按值捕获(Capture by Value)和按引用捕获(Capture by Reference 捕获列表初始化(Capture Initializers) C++ 14 支持 lambda capture initializers。
机器之心报道 编辑:陈萍 C++ 是一门古老又新颖的语言,现代C++ 具备哪些新特性呢?这本书带你了解。 C++ 自发明以来,经历了多次修订,每一次修订都为C++ 增加了新的特性并作了一些修改。 现代 C++ (指 C++11/14/17/20) 的大量特性使得整个 C++ 语言更加现代化。 本文要介绍的这本书就是关于现代C++ 的。相比于传统的C++,现代C++ 具有哪些新特性呢? 目标读者 这本书假定读者已经熟悉了传统 C++ ,至少在阅读传统 C++ 代码上不具备任何困难。 换言之,那些长期使用传统 C++进行编码的人、渴望在短时间内迅速了解现代 C++特性的人非常适合阅读本书; 本书一定程度上介绍了一些现代 C++ 的黑魔法,但这些魔法毕竟有限,不适合希望进阶学习现代 C++ 的读者,本书的定位系现代 C++ 的快速上手。
注意 自 C++11 正式发布以来已经过去了 10 年,它不再被认为是现代 C++ 标准。除非你的目标环境非常老旧,否则不建议用这个版本开始项目。 要求 C++23 可能有点过分,即使在一个现代环境中。但 C++14 应该完全没问题,因为它自 2015 年以来已经在GCC/Clang中得到全面支持。 下一步是使用我们在实际项目中将要使用的更现代的 C++特性来扩展这个简单的文件——也许通过添加一个可变模板来看目标机器上的编译器是否能消化它。 我们故意关注现代、优雅的实践,避免引入太多的遗留问题。具体来说,我们将处理逻辑构建目标,而不是操纵单个文件。 接下来,我们将详细解释工具链执行的二进制工件构建步骤。 其次,循环展开可能会对现代 CPU 产生不希望的效果,因为代码尺寸的增加可能会阻止有效缓存。
int)); // modern: // #include <vector> std::vector<int> arr(10); 字符串 // naive: char str[] = "Hello, C+ ; // modern: // #include <string> std::string str = "Hello, C++!"; // or auto str = "Hello, C++!"
2、无序容器 传统c++中的有序容器 std::map / std::set,这些元素内部通过红黑树进行实现,插入和搜索的平均复杂度均为O(log(size))。 auto & n : v){ cout << "Key:[" << n.first << "] Value:[" << n.second << "]\n"; } } 3、元组 传统c+
开启现代C++的C++11引入了unique_ptr、shared_ptr和weak_ptr等智能指针。unique_ptr采用严格的所有权语义,保证对象只被单个指针所有。 1.1 从C++智能指针获取的裸指针变成悬垂指针下面所讨论的C++踩坑悬垂指针,以及之后的Rust避坑悬垂指针,并不是暗示C++不如Rust好,而仅仅是为了提升自学者入门Rust的动力而已。 macOS 安装C++环境:使用Xcode安装Clang验证安装C++环境是否成功:运行命令clang++ --version创建新的C++项目:安装cmake-init【脚注:cmake-init下载链接 std::指的是shared_ptr是C++标准库中提供的一种智能指针。❓什么是C++的智能指针?什么是shared_ptr?智能指针是C++中用于自动管理动态分配内存的对象。 相比C++在混用裸指针时不做任何标记,Rust用unsafe块提醒程序员,要担负好内存安全的责任。Rust既然能帮程序员避现代C++的悬垂指针的坑,那它能帮程序员避Java什么坑?
现代C++之手写智能指针 0.回顾 ? 所有代码还是放在仓库里面,欢迎star! 如果你觉得这个实现很别扭的话,也恭喜你,因为 C++ 委员会也是这么觉得的:auto_ptr 在 C++17 时已经被正式从C++ 标准里删除了。 上面会导致什么问题呢? 而这时就有一群人开始扩展C++标准库的关于智能指针的部分,他们组成了boost社区,他们负责boost库的开发和维护。其目的是为C++程序员提供免费的、同行审查的、可移植的程序库。 )); return shared_ptr<T>(other, ptr); } 调用: int a = reinterpret_pointer_cast<int>(s); 参考自吴老师的《现代 C++实战30讲》第二讲。
第四章,使用目标工作: 在这里,我们强调了现代 CMake 项目如何广泛使用目标。我们的项目也将如此,以下原因是: 定义几个库和可执行文件(用于测试和生产)将使项目保持组织性并保持干燥. 第五章,使用 CMake 编译 C++源代码: 没有编译的 C++项目是不存在的。基础知识相当简单,但 CMake 允许我们在许多方面调整此过程:扩展目标源、配置优化器、提供调试信息。 》,我们可以使用 CMake 捕获一些构建时的值,并通过模板文件将它们提供给 C++代码——例如,使用一个方便的 C++结构体: chapter-12/01-full-project/cmake/buildinfo.h.in 然而,这些文件是 C++项目的重要组成部分,应该为完整性而覆盖。 正则表达式操作遵循 C++标准库中<regex>头文件定义的 C++语法。
正确掌握链接的基础知识 我们在第五章中讨论了 C++ 程序的生命周期,使用 CMake 编译 C++ 源代码。它包括五个主要阶段——编写、编译、链接、加载和执行。 为此,我们需要提供一个此类结构的模式,它将用于将二进制形式写入和读取 C++对象。 pkg-config正逐渐被其他更现代的解决方案所取代。这里出现了一个问题——你应该投入时间支持它吗? 为测试搭建项目结构 C++具有一些有限的内省能力,但无法提供像 Java 那样的强大回顾功能。这可能正是编写 C++代码的测试和单元测试框架比在其他更丰富的环境中困难的原因。 当然,如果你能使用现代 C++(是的,C++11 不再被认为是“现代”的),那么推荐使用更新的版本。在与 Catch2 合作时,你应该选择一个 Git 标签并在你的列表文件中固定它。
的另一件事是要关注代码现代化:随着 C++的发展,它提供了新特性。跟踪我们可以重构以适应最新标准的所有地方可能会很困难。 幸运的是,我们可以使用自动工具来检查和强制执行规则、修复错误并现代化代码为我们。是时候发现程序分析工具了。我们的代码将在每次构建时进行检查,以确保其符合行业标准。 提供的检查项包括性能改进、可读性、现代化、cpp-core-guidelines 和易出错命名空间等方面的改进。 Cpplint 以下是从官方网站对 Cpplint 的描述: Cpplint 是一个命令行工具,用于检查遵循 Google C++风格指南的 C/C++文件的风格问题。 进一步阅读 要获取更多信息,你可以参考以下链接: 由 C++创作者 Bjarne Stroustrup 整理的C++核心指南: github.com/isocpp/CppCoreGuidelines
现代C++提供了许多高效的并发编程模式,以满足日益增长的多核和分布式系统的需求。 同时,还可以结合使用C++标准库和第三方库,如Boost等,来提供更多的并发编程支持和工具。
现代 CMake for C++ 是一本端到端的指南,提供了更简单的体验,因为它全面地处理了 C++解决方案的构建。 第七章,使用 CMake 管理依赖项,解释了现代 CMake 中可用的依赖管理方法。 理解基础知识 编译 C++源代码似乎是一个相当直接的过程。 关于 CMake,有几件事情我觉得(主观地)很重要: 它专注于支持现代编译器和工具链。 注释 就像在**C++**中一样,有两种注释——单行注释和方括号 (多行)注释。但与 C++不同,方括号注释可以嵌套。
一、学习路线:分阶段掌握 C++阶段 1:基础语法与编程思维目标:掌握 C++ 基本语法,理解面向对象编程(OOP)核心概念。 推荐资源:书籍:《深入理解 C++ 对象模型》工具:gdb 调试器、objdump 反汇编工具。阶段 4:高级特性与现代 C++目标:掌握 C++11/14/17/20 新特性,提升代码质量与性能。 内容:现代 C++ 特性:自动类型推导(auto)、范围循环(for (auto x : container))。Lambda 表达式与函数式编程。移动语义(std::move)与右值引用。 关注社区动态:跟踪 C++ 标准委员会提案(如 C++23 的新特性)。四、总结:C++ 专家的成长路径基础扎实:从语法到 STL,掌握 C++ 的核心工具链。 拥抱现代 C++:利用 C++11/14/17/20 的新特性提升效率。实战积累:通过项目和竞赛锻炼工程能力。持续优化:关注性能调优与跨平台兼容性。