Abseil 简介:它是什么以及为什么需要它
\n\nAbseil(发音为“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
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
安装 Abseil
\n\n与 Python 或 JavaScript 不同,C++ 库不能通过 pip 或 npm 安装。Abseil 以源代码形式分发,需要使用 CMake 或 Bazel 进行构建。我们来看看最流行的方法——通过 CMake 构建。
通过 vcpkg 安装(推荐用于 Windows)
\nvcpkg 是微软的 C++ 包管理器。
\ngit clone https://github.com/Microsoft/vcpkg.git\ncd vcpkg\n.\\bootstrap-vcpkg.bat\n.\\vcpkg install abseil:x64-windows\n\n通过 Conan 安装
\nConan 是另一个流行的包管理器。
\npip install conan\nconan install abseil/20230801.0@\n\n通过 CMake 手动构建
\ngit 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 中链接
\nfind_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编译