Abseil for C++:完整指南与示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Abseil 简介:它是什么以及为什么需要它

\n\n

Abseil(发音为“ab-sil”)是 Google 为 C++ 语言开发的一个开源库。它旨在补充 C++ 标准库 (STL),并提供一套高质量、经过充分测试且高效的组件,Google 内部几乎所有的 C++ 项目都使用这些组件进行开发。

\n\n

为什么需要 Abseil?主要原因如下:

\n
    \n
  • 填补 STL 的空白: C++ 标准库发展缓慢。Abseil 为实践中经常出现但尚未纳入标准的问题(例如字符串处理、命令行标志、哈希表)提供了现成的解决方案。
  • \n
  • 高性能: Abseil 的代码针对现代处理器和编译器进行了优化。许多算法都考虑到了缓存和 SIMD 指令。
  • \n
  • 安全性和可靠性: 该库在 Google 的生产环境中广泛使用,保证了其稳定性。所有函数都有严格的边界和类型检查。
  • \n
  • 兼容性: Abseil 适用于所有主流编译器(GCC、Clang、MSVC)和操作系统(Linux、macOS、Windows)。
  • \n
  • 模块化: 您只需使用所需的组件,而无需链接整个库。
  • \n
\n\n

Abseil 由几个关键模块组成:

\n
    \n
  • absl/strings: 用于字符串处理的增强功能(分割、连接、替换、格式化)。
  • \n
  • absl/container: 额外的容器(flat_hash_map、flat_hash_set、InlinedVector 等)。
  • \n
  • absl/flags: 一个强大的命令行标志处理系统。
  • \n
  • absl/time: 时间和时区处理。
  • \n
  • absl/status: 改进的错误处理(StatusOr、Status)。
  • \n
  • absl/algorithm: 额外的算法(contains、clamp 等)。
  • \n
\n\n

安装 Abseil

\n\n

与 Python 或 JavaScript 不同,C++ 库不能通过 pip 或 npm 安装。Abseil 以源代码形式分发,需要使用 CMake 或 Bazel 进行构建。我们来看看最流行的方法——通过 CMake 构建。

\n\n

通过 vcpkg 安装(推荐用于 Windows)

\n

vcpkg 是微软的 C++ 包管理器。

\n
git clone https://github.com/Microsoft/vcpkg.git\ncd vcpkg\n.\\bootstrap-vcpkg.bat\n.\\vcpkg install abseil:x64-windows
\n\n

通过 Conan 安装

\n

Conan 是另一个流行的包管理器。

\n
pip install conan\nconan install abseil/20230801.0@
\n\n

通过 CMake 手动构建

\n
git clone https://github.com/abseil/abseil-cpp.git\ncd abseil-cpp\nmkdir build && cd build\ncmake .. -DCMAKE_INSTALL_PREFIX=/usr/local\ncmake --build . --target install
\n\n

在 CMakeLists.txt 中链接

\n
find_package(absl REQUIRED)\ntarget_link_libraries(my_project\n    absl::strings\n    absl::flat_hash_map\n    absl::flags\n)
\n\n

快速入门:代码示例

\n\n

让我们编写一个简单的程序,使用 Abseil 进行字符串处理和命令行标志处理。

\n\n
#include <iostream>\n#include "absl/strings/str_join.h"\n#include "absl/flags/flag.h"\n#include "absl/flags/parse.h"\n\nABSL_FLAG(std::string, name, "World", "问候的名字");\n\nint main(int argc, char* argv[]) {\n    absl::ParseCommandLine(argc, argv);\n\n    std::vector<std::string> words = {"Hello", absl::GetFlag(FLAGS_name), "!"};\n    std::string greeting = absl::StrJoin(words, " ");\n\n    std::cout << greeting << std::endl;\n    return 0;\n}
\n\n

编译

推荐