Skip to content

Latest commit

 

History

History
149 lines (89 loc) · 12 KB

File metadata and controls

149 lines (89 loc) · 12 KB

零、前言

C++ 是一种通用编程语言,它结合了不同的范例,如面向对象、命令式、泛型和函数式编程。C++ 是为提高效率而设计的,是性能至关重要的应用的主要选择。在过去的几十年里,C++ 一直是工业、学术界和其他地方使用最广泛的编程语言之一。该语言由国际标准化组织(ISO)进行标准化,该组织目前正在研究该标准的下一个版本,名为 C++ 20,将于 2020 年完成。

标准覆盖了将近 1500 页,C++ 不是最简单的学习和掌握的语言。技能不是通过阅读或看别人练习获得的,而是通过一次又一次的练习获得的。编程也没什么不同;我们开发人员不会仅仅通过阅读书籍、文章或观看视频教程来学习新的语言或技术。相反,我们需要实践来沉淀和发展我们所学的新东西,这样我们才能最终掌握它们。然而,很多时候,找到好的练习来检验我们的知识是一项困难的任务。虽然有许多网站都有不同编程语言的问题,但大多数都是数学问题、算法或学生竞赛的问题。这些类型的问题并不能帮助你使用各种各样的编程语言功能。这就是本书的切入点。

这本书收集了 100 个现实世界的问题,旨在让您练习各种各样的 C++ 语言和标准库功能,以及许多第三方、跨平台的库。然而,这些问题中有一些是 C++ 特有的,通常可以用许多编程语言来解决。当然,目的是帮助你掌握 C++,因此你应该用 C++ 来解决它们。书中提供的所有解决方案都是 C++ 语言。但是,当您学习其他编程语言时,您可以将这本书作为其建议问题集的参考,尽管在这种情况下,您不会从解决方案中受益。

这本书里的问题分为 12 章。每章都包含类似或相关主题的问题。这些问题有不同的难度;有些容易,有些适中,有些困难。这本书对每个难度等级都有相对相等数量的问题。每一章都从描述提出的问题开始。这些问题的解决方案伴随着建议、解释和源代码。虽然你可以在书中找到解决方案,但建议你先尝试自己实现它们,然后——或者如果你很难完成它们——再看看建议的解决方案。书中展示的源代码只缺少一样东西——你必须包含的标题。这是故意漏掉的,这样你就可以自己弄清楚了。另一方面,这本书提供的源代码是完整的,你可以在那里找到所有需要的标题。

在撰写本书时,该标准的 C++ 20 版本正在开发中,并将在未来几年内继续使用。然而,一些功能已经被投票通过,其中一个功能是扩展到带有日历和时区的chrono图书馆。关于这个主题的第五章有几个问题,虽然还没有编译器支持这些问题,但是您可以使用date库来解决这些问题,新的标准附件就是基于这个库设计的。许多其他的图书馆被用来解决书中的问题。该列表包括 Asio、Crypto++、Curl、NLohmann/json、PDF-Writer、PNGWriter、pugixml、SQLite 和 ZipLib。此外,作为本书中使用的std::optionalfilesystem库的替代,您可以在编译器不可用的地方使用 Boost。所有这些库都是开源和跨平台的。选择它们的原因包括性能、良好的文档以及在社区中的广泛使用。但是,您可以自由使用任何其他想要解决问题的库。

这本书是给谁的

你是否在尝试学习 C++ 并寻找挑战来实践你所学的内容?如果是的话,这本书是给你的。这本书是为学习 C++ 的人准备的,不管他们对其他编程语言有什么经验,作为实践练习和现实问题的宝贵资源。这本书没有教你语言或标准图书馆的特点。你应该从其他资源中学习,比如书籍、文章或视频教程。这本书是一个学习的伴侣,并挑战你解决各种困难的任务,利用你以前从其他资源中学到的技能。尽管如此,本书中提出的许多问题都是语言不可知的,您可以在学习其他编程语言时使用它们;但是,在这种情况下,您不会从这里提供的解决方案中受益。

充分利用这本书

如前所述,您需要基本熟悉 C++ 语言和标准库,以便能够利用这本书,或者您可以一路学习。无论如何,这本书会教你如何解决问题,但不会教你解决方案中使用的语言和功能。您将需要一个支持 C++ 17 的编译器;在代码包中提供的软件硬件列表中可以找到所需库以及您可以使用的可能编译器的完整列表。在接下来的章节中,您将从本书中找到下载和构建代码的详细说明。

下载示例代码文件

您可以在www.packtpub.com从您的账户下载包含本书问题解决方案的代码文件。如果您在其他地方购买了这本书,您可以访问www.packtpub.com/support并注册将文件直接通过电子邮件发送给您。

您可以按照以下步骤下载代码文件:

  1. 登录或注册www.packtpub.com
  2. 选择“支持”选项卡。
  3. 点击代码下载和勘误表。
  4. 在搜索框中输入图书的名称,并按照屏幕指示进行操作。

下载文件后,请确保使用最新版本的解压缩文件夹:

  • 视窗系统的 WinRAR/7-Zip
  • zipeg/izp/un ARX for MAC
  • 适用于 Linux 的 7-Zip/PeaZip

这本书的代码包也托管在 https://github.com/PacktPublishing/The-Modern-Cpp-Challenge 的 GitHub 上。我们还有来自丰富的书籍和视频目录的其他代码包,可在获得。看看他们!

构建代码

尽管整本书使用了大量的第三方库,但所有这些库以及书中提供的所有解决方案都是跨平台的,并且在所有平台上运行。但是,该代码已经在 Windows 10 上使用 Visual Studio 2017 v15.6/7 和在 Mac OS 10.13.x 上使用 Xcode 9.3 进行了开发和测试。

如果您在 Mac 上使用 Xcode,书中使用的两个功能是 Xcode 中包含的 LLVM 工具集所没有的;这些是filesystem库和std::optional。但是,这些库是基于Boost.FilesystemBoost.Optional库设计的,在建议的解决方案中使用上述标准库很容易与 Boost 库互换。事实上,附带的代码是这样编写的,它可以与两者中的任何一个一起工作;用几个宏来控制使用哪一个。下面提供了用一个或另一个构建的说明,尽管源归档中也有相同的信息。

为了支持大多数开发环境并构建可以在各种平台上使用的系统,代码附带了 CMake 脚本。这些用于为您的首选工具集生成项目或构建脚本。如果您的机器上没有安装 CMake,可以从https://cmake.org/获得。下面,您可以找到使用 CMake 生成 Visual Studio 和 Xcode 脚本的说明。对于其他工具,如有必要,请参考 CMake 文档。

如何为 Visual Studio 2017 生成项目

请执行以下操作,以生成面向 x86 平台的 Visual Studio 2017 项目:

  1. 打开命令提示符,转到源代码根文件夹中的build目录。

  2. 执行以下命令:

    cmake -G "Visual Studio 15 2017" .. -DCMAKE_USE_WINSSL=ON -DCURL_WINDOWS_SSPI=ON -DCURL_LIBRARY=libcurl -DCURL_INCLUDE_DIR=..\libs\curl\include -DBUILD_TESTING=OFF -DBUILD_CURL_EXE=OFF -DUSE_MANUAL=OFF

  3. 完成后,可以在build/cppchallenger.sln找到 Visual Studio 解决方案。

如果你想以 x64 平台为目标,可以使用名为"Visual Studio 15 2017 Win64"的生成器。Visual Studio 2017 15.4 同时支持filesystem(作为实验库)和std::optional。如果您使用以前的版本,或者只想使用 Boost 库,则可以在正确安装 Boost 后,使用以下命令生成项目:

cmake -G "Visual Studio 15 2017" .. -DCMAKE_USE_WINSSL=ON -DCURL_WINDOWS_SSPI=ON -DCURL_LIBRARY=libcurl -DCURL_INCLUDE_DIR=..\libs\curl\include -DBUILD_TESTING=OFF -DBUILD_CURL_EXE=OFF -DUSE_MANUAL=OFF -DBOOST_FILESYSTEM=ON -DBOOST_OPTIONAL=ON -DBOOST_INCLUDE_DIR=<path_to_headers> -DBOOST_LIB_DIR=<path_to_libs>

确保头文件和静态库文件的路径不包含尾随反斜杠(即\)。

如何为 Xcode 生成项目

上一章中的几个解决方案利用了libcurl库。对于 SSL 支持,该库需要与OpenSSL库链接。请执行以下操作来安装 OpenSSL:

  1. https://www.openssl.org/下载库。

  2. 解压缩档案,在终端中,转到它的根目录。

  3. 使用以下命令(按此顺序执行)构建和安装库:

    ./Configure darwin64-x86_64-cc shared enable-ec_nistp_64_gcc_128 no-ssl2 no-ssl3 no-comp --openssldir=/usr/local/ssl/macos-x86_64

    make depend

    sudo make install

std::optionalfilesystem库与 Xcode 的 Clang 一起可用之前,您需要使用 Boost。请执行以下操作来安装和构建 Boost 库:

  1. https://brew.sh/安装家酿。

  2. 运行以下命令自动下载并安装 Boost。

    brew install boost

  3. 安装后,Boost 库将在/usr/local/Cellar/boost/1.65.0可用。

为了从源中为 Xcode 生成项目,您必须:

  1. 打开一个终端,转到源代码根目录下的build目录。

  2. 执行以下命令:

    cmake -G Xcode .. -DOPENSSL_ROOT_DIR=/usr/local/bin -DOPENSSL_INCLUDE_DIR=/usr/local/include/ -DBUILD_TESTING=OFF -DBUILD_CURL_EXE=OFF -DUSE_MANUAL=OFF -DBOOST_FILESYSTEM=ON -DBOOST_OPTIONAL=ON -DBOOST_INCLUDE_DIR=/usr/local/Cellar/boost/1.65.0 -DBOOST_LIB_DIR=/usr/local/Cellar/boost/1.65.0/lib

  3. 完成后,可在build/cppchallenger.xcodeproj找到 Xcode 项目。

使用的约定

本书通篇使用了许多文本约定。

CodeInText:表示文本中的码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟网址、用户输入和推特句柄。下面是一个例子:“将下载的WebStorm-10*.dmg磁盘镜像文件作为另一个磁盘挂载到系统中。”

代码块设置如下:

int main()
{
   std::cout << "Hello, World!\n";
}

当我们希望将您的注意力吸引到代码块的特定部分时,相关的行或项目以粗体显示:

template<typename C, typename... Args>
void push_back(C& c, Args&&... args)
{
 (c.push_back(args), ...);
}

任何命令行输入或输出都编写如下:

$ mkdir build
$ cd build

粗体:表示一个新的术语、一个重要的单词或者你在屏幕上看到的单词。例如,菜单或对话框中的单词像这样出现在文本中。下面是一个示例:“从管理面板中选择系统信息。”

Warnings or important notes appear like this. Tips and tricks appear like this.

取得联系

我们随时欢迎读者的反馈。

综合反馈:发邮件[email protected]并在邮件主题中提及书名。如果您对本书的任何方面有疑问,请发电子邮件至[email protected]

勘误表:虽然我们已经尽了最大的努力来保证内容的准确性,但是错误还是会发生。如果你在这本书里发现了一个错误,如果你能向我们报告,我们将不胜感激。请访问www.packtpub.com/submit-errata,选择您的图书,点击勘误表提交链接,并输入详细信息。

盗版:如果您在互联网上遇到任何形式的我们作品的非法拷贝,如果您能提供我们的位置地址或网站名称,我们将不胜感激。请通过[email protected]联系我们,并提供材料链接。

如果你有兴趣成为一名作者:如果有一个你有专长的话题,你有兴趣写或者投稿一本书,请访问authors.packtpub.com

复习

请留下评论。一旦你阅读并使用了这本书,为什么不在你购买它的网站上留下评论呢?然后,潜在的读者可以看到并使用您不带偏见的意见来做出购买决定,我们在 Packt 可以了解您对我们产品的看法,我们的作者可以看到您对他们的书的反馈。谢谢大家!

更多关于 Packt 的信息,请访问packtpub.com