ericniebler / range-v3安装和使用方法指南

830 阅读4分钟

range-v3

C++14/17/20的范围库。这段代码是在C++标准库中添加范围支持的正式提案的基础。该提案经过技术规范的演变,最终成为P0896R4 "The One Ranges Proposal",并在2018年11月被合并到C++20工作草案中。

关于

范围是标准模板库的一个扩展,通过使其迭代器和算法具有可组合性而使其更加强大。与其他寻求取消迭代器的类范围解决方案不同,在range-v3中,范围是迭代器之上的一个抽象层。

Range-v3是建立在三个支柱之上的。视图、行动和算法。算法与你在STL中已经熟悉的算法相同,只是在range-v3中,除了接受迭代器的重载外,所有的算法都有接受范围的重载。视图是对范围的可组合的改编,在视图被迭代的过程中,改编会懒洋洋地发生。动作是算法对容器的急切应用,它在原地突变容器,并返回它进行进一步处理。

视图和动作使用管道语法(例如,rng | adapt1 | adapt2 | ... ),所以你的代码很简洁,从左到右可读。

文档

查看这里的(非常不完整的)文档。

其他资源(注意日期,该库可能在那之后发生了变化)。

许可证

这个项目中的大部分源代码都是我的,这些都是在Boost软件许可下的。部分内容取自Alex Stepanov的《Elements of Programming》,Howard Hinnant的libc++,以及SGI STL。请参阅附件中的LICENSE文件和CREDITS文件,了解许可和鸣谢。

支持的编译器

该代码已知可在以下编译器上运行。

  • clang 5.0 (或更高版本)
  • GCC 6.5 (或更高版本)
  • Windows上的Clang/LLVM 6(或更高版本)(旧版本可能会工作--我们没有测试过)。
  • Windows上的Visual Studio 2019(或更高版本),由于range-v3的严格一致性要求,有一些注意事项。
    • range-v3需要/permissive-/std:c++latest,/std:c++20, 或/std:c++17

**开发状态。**这段代码相当稳定,测试良好,适合休闲使用,尽管目前缺乏文档。一般来说,对支持或长期稳定性不做任何承诺。这段代码发展不考虑向后的兼容性。

一个明显的例外是在ranges::cpp20 名称空间中发现的任何东西。这些组件将很少或(最好)永远不会改变。

构建状态

  • on GitHub Actions: GitHub Actions Status

构建range-v3 - 使用vcpkg

你可以使用vcpkg依赖管理器下载和安装range-v3。

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install range-v3

vcpkg中的range-v3端口由微软团队成员和社区贡献者保持更新。如果版本过期,请在vcpkg仓库中创建一个问题或拉动请求

构建range-v3 - 使用Conan

你可以使用Conan依赖管理器下载并安装range-v3。

设置你的CMakeLists.txt(参见Conan文档中关于如何使用MSBuild,Meson和其他的)。

project(myproject CXX)

add_executable(${PROJECT_NAME} main.cpp)

include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) # Include Conan-generated file
conan_basic_setup(TARGETS) # Introduce Conan-generated targets

target_link_libraries(${PROJECT_NAME} CONAN_PKG::range-v3)

在你的源代码目录下创建conanfile.txt

[requires]
range-v3/0.12.0

[generators]
cmake

安装并运行conan ,然后像往常一样构建你的项目。

pip install conan
mkdir build
cd build
conan install ../ --build=missing
cmake ../
cmake --build .

构建range-v3 - 使用build2

你可以使用 build2,一个依赖管理器和一个构建系统的组合,来使用range-v3 (或对它进行工作)。

目前这个软件包在这些软件包库中可用。

用法

例如,要使你的build2 项目依赖于range-v3

  • 在你的配置中添加其中一个仓库,或者在你的repositories.manifest ,如果还没有的话;比如说。

    :
    role: prerequisite
    location: https://pkg.cppget.org/1/alpha # v0.11.0 is there.
    
  • 在你的manifest 文件中添加这个包作为依赖关系(v0.11.x 的例子)。

    depends: range-v3 ~0.11.0
    
  • buildfile导入目标并将其作为你自己的目标的先决条件,在适当的range-v3

    import range_v3 = range-v3%lib{range-v3}
    
    lib{mylib} : cxx{**} ... $range_v3
    

然后像往常一样构建你的项目(使用bbdep update ),build2 会解决剩下的问题。

对于build2 新手或想获得更多的细节和使用案例,你可以阅读本文档build2 工具链介绍。

说声谢谢!

我做这项工作是因为我爱它,也因为我爱C++,希望它能像我知道的那样出色。如果你喜欢我的工作,并且正在寻找一种方式来表示感谢,你可以在我的博客上留下一个支持性的评论。或者你可以在我的Open Hub range-v3贡献页面上给我留下一些赞美。只要点击这里的 Give Kudos按钮。