Skip to content

range-v3 — 范围库

range-v3 是 Eric Niebler 开发的 C++ 范围库,也是 C++20 std::ranges 的原型。在 C++17 项目中使用,或需要 C++20 尚未包含的高级特性时使用。

安装

bash
vcpkg install range-v3

# CMake
find_package(range-v3 REQUIRED)
target_link_libraries(myapp PRIVATE range-v3::range-v3)

基本用法

cpp
#include <range/v3/all.hpp>
namespace rv = ranges::views;

std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

// 管道语法
auto result = v
    | rv::filter([](int x) { return x % 2 == 0; })
    | rv::transform([](int x) { return x * x; })
    | rv::take(3)
    | ranges::to<std::vector>();
// result = {4, 16, 36}

// 收集为不同容器
auto s = v | rv::filter([](int x){ return x > 5; })
           | ranges::to<std::set>();

// zip
std::vector<std::string> names = {"Alice", "Bob", "Charlie"};
std::vector<int> ages = {30, 25, 35};
for (auto [name, age] : rv::zip(names, ages)) {
    std::cout << name << ": " << age << "\n";
}

// enumerate
for (auto [i, x] : rv::enumerate(v)) {
    std::cout << i << ": " << x << "\n";
}

// chunk
for (auto chunk : v | rv::chunk(3)) {
    for (int x : chunk) std::cout << x << " ";
    std::cout << "\n";
}

关键认知

range-v3 提供了比 C++20 std::ranges 更多的 views(如 zipenumeratechunk 在 C++23 才进标准)。C++17 项目的首选范围库,C++23 项目可以直接用标准库。

系统学习 C++ 生态,深入底层架构