当前位置: 首页 > news >正文

一文总结C++ STL算法库

C++ 标准库的 <algorithm> 提供了大量通用的算法, 用于操作容器, 范围和迭代器. 本文对其做了归纳总结, 并配上代码以供读者了解其功能. 整理不易, 希望您点赞或者收藏, 非常感谢.

本文所有代码均可在此处获取.

编译器要求

本文的代码需要编译器支持 C++23 标准才可以运行. 另外部分示例目前需要使用 Visual Studio(MSVC) 才可以编译通过.
本文示例在如下编译器上面编译通过:

  • GCC 14.2
  • Clang 18.1.3

批处理操作

  • for_each, ranges::for_each: 对范围内的每一个元素执行操作

    std::vector v = {1, 2, 3, 4, 5};
    // for_each
    std::for_each(v.begin(), v.end(), [](int& n) { n *= 2; });
    fmt::println("{}", v);  // [2, 4, 6, 8, 10]// ranges::for_each (C++20)
    std::ranges::for_each(v, [](int& n) { n = 1; });
    fmt::println("{}", v);  // [1, 1, 1, 1, 1]
    
  • for_each_n, ranges::for_each_n (C++17): 对一个序列的前 N 个元素执行操作

    std::vector  v = {1, 2, 3, 4, 5};
    // for_each_n (C++17)
    std::for_each_n(v.begin(), 3, [](int& n) { n = 2; });
    fmt::println("{}", v);  // [2, 2, 2, 1, 1]// ranges::for_each_n (C++20)
    std::ranges::for_each_n(v.begin(), 2, [](int& n) { n = 3; });
    fmt::println("{}", v);  // [3, 3, 2, 1, 1]
    

搜索操作

这些算法不会修改容器中的元素, 主要用于查询, 统计和范围操作.

检查元素

  • all_of, ranges::all_of (C++20): 检查范围内所有元素是否满足条件.

    constexpr std::array v = {1, 2, 3, 4, 5};
    // all_of
    fmt::println("All elements greater than 0: {}",std::all_of(v.begin(), v.end(), [](int n) { return n > 0; }));
    // ranges::all_of (C++20)
    fmt::println("All elements greater than 1: {}",std::ranges::all_of(v, [](int n) { return n > 1; }));
    
  • any_of, ranges::any_of (C++20): 检查范围内是否存在满足条件的元素.

    constexpr std::array v = {1, 2, 3, 4, 5};
    // any_of
    fmt::println("Any element greater than 4: {}",std::any_of(v.begin(), v.end(), [](int n) { return n > 4; }));
    // ranges::any_of (C++20)
    fmt::println("Any element greater than 6: {}",std::ranges::any_of(v, [](int n) { return n > 6; }));
    
  • none_of, ranges::none_of (C++20): 检查范围内所有元素是否都不满足条件.

    constexpr std::array v = {1, 2, 3, 4, 5};
    // none_of
    fmt::println("None of the elements greater than 6: {}",std::none_of(v.begin(), v.end(), [](int n) { return n > 6; }));
    // ranges::none_of (C++20)
    fmt::println("None of the elements greater than 2: {}",std::ranges::none_of(v, [](int n) { return n > 2; }));
    

查找

  • ranges::contains (C++23): 检查范围是否包含指定值.

    std::vector v = {1, 2, 3, 4, 5, 3};
    // ranges::contains (C++23)
    fmt::print("Vector contains 3: {}\n", std::ranges::contains(v, 3));
    // Vector contains 3: true
    
  • ranges::contains_subrange (C++23): 检查范围是否包含指定子范围.

    std::vector<int> v = {1, 2, 3, 4, 5, 3};
    std::vector<int> sub_v = {3, 4};// ranges::contains_subrange (C++23)
    fmt::print("Vector contains sub - range {{3, 4}}: {}\n",std::ranges::contains_subrange(v, sub_v));
    // Vector contains sub - range {3, 4}: true
    
  • find, ranges::find: 查找第一个等于指定值的元素.

    std::vector<int> v = {1, 2, 3, 4, 5, 3};// find
    if (auto it = std::find(v.begin(), v.end(), 3); it != v.end()) {fmt::print("Found 3 at position: {}\n", std::distance(v.begin(), it));// Found 3 at position: 2
    }
    // ranges::find
    if (auto rit = std::ranges::find(v, 3); rit != v.end()) {fmt::print("Found 3 at position (ranges): {}\n",std::distance(v.begin(), rit));// Found 3 at position (ranges): 2
    }
    
  • find_if, ranges::find_if: 查找第一个满足条件的元素.

    std::vector<int> v = {1, 2, 3, 4, 5, 3};// find_if
    // 查找第一个大于 3 的元素,第一个大于 3 的元素是 4,其位置索引是 3
    if (auto it_if =std::find_if(v.begin(), v.end(), [](int n) { return n > 3; });it_if != v.end()) {fmt::print("Found element greater than 3 at position: {}\n",std::distance(v.begin(), it_if));// Found element greater than 3 at position: 3
    }// ranges::find_if
    // 使用 ranges 版本查找第一个大于 3 的元素,结果位置索引同样是 3
    if (auto rit_if = std::ranges::find_if(v, [](int n) { return n > 3; });rit_if != v.end()) {fmt::print("Found element greater than 3 at position (ranges): {}\n",std::distance(v.begin(), rit_if));// Found element greater than 3 at position (ranges): 3
    }
    
  • find_if_not, ranges::find_if_not: 查找第一个不满足条件的元素.

    std::vector<int> v = {1, 2, 3, 4, 5, 3};
    // find_if_not
    // 查找第一个不大于 3 的元素,也就是第一个小于等于 3 的元素,是 1,位置索引是0
    if (auto it_if_not =std::find_if_not(v.begin(), v.end(), [](int n) { return n > 3; });it_if_not != v.end()) {fmt::print("Found element not greater than 3 at position: {}\n",std::distance(v.begin(), it_if_not));// Found element not greater than 3 at position: 0
    }// ranges::find_if_not
    // 使用 ranges 版本查找第一个不大于 3 的元素,结果位置索引还是 0
    if (auto rit_if_not =std::ranges::find_if_not(v, [](int n) { return n > 3; });rit_if_not != v.end()) {fmt::print("Found element not greater than 3 at position (ranges): {}\n",std::distance(v.begin(), rit_if_not));// Found element not greater than 3 at position (ranges): 0
    }
    
  • ranges::find_last (C++23):查找最后一个等于指定值的元素.

    std::vector<int> numbers = {1, 2, 3, 2, 4, 2};
    int target = 2;
    auto result = std::ranges::find_last(numbers, target);
    if (result.begin() != numbers.end()) {fmt::println("ranges::find_last: Found 2 at index {}",std::distance(numbers.begin(), result.begin()));
    } else {fmt::println("ranges::find_last: Not found");
    }
    
  • ranges::find_last_if (C++23): 查找最后一个满足条件的元素.

    std::vector<int> numbers = {1, 2, 3, 4, 5, 6};
    auto isEven = [](int num) { return num % 2 == 0; };
    auto result = std::ranges::find_last_if(numbers, isEven);
    if (result.begin() != numbers.end()) {fmt::println("ranges::find_last_if: Found last even number {} at index {}",*result.begin(),std::distance(numbers.begin(), result.begin()));// 预期输出: ranges::find_last_if: Found even number 6 at index 5
    } else {fmt::println("ranges::find_last_if: Not found");
    }
    
  • ranges::find_last_if_not (C++23): 查找最后一个不满足条件的元素.

    std::vector<int> numbers = {2, 4, 6, 3, 8, 10};
    auto isEven = [](int num) { return num % 2 == 0; };
    auto result = std::ranges::find_last_if_not(numbers, isEven);
    if (result.begin() != numbers.end()) {fmt::println("ranges::find_last_if_not: Found odd number {} at index {}",*result.begin(),std::distance(numbers.begin(), result.begin()));// 预期输出: ranges::find_last_if_not: Found odd number 3 at index 3
    } else {fmt::println("ranges::find_last_if_not: Not found");
    }
    
  • find_end, ranges::find_end: 查找某个子范围在另一个范围中最后一次出现的位置.

    std::vector<int> mainRange = {1, 2, 3, 4, 1, 2, 3};
    std::vector<int> subRange = {1, 2, 3};
    // 使用 std::find_end
    auto stdResult = std::find_end(mainRange.begin(), mainRange.end(),subRange.begin(), subRange.end());
    if (stdResult != mainRange.end()) {fmt::println("std::find_end: Sub - range found starting at index {}",std::distance(mainRange.begin(), stdResult));// 预期输出: std::find_end: Sub - range found starting at index 4
    } else {fmt::println("std::find_end: Sub - range not found");
    }// 使用 std::ranges::find_end
    auto rangesResult = std::ranges::find_end(mainRange, subRange);
    if (!rangesResult.empty()) {fmt::println("std::ranges::find_end: Sub - range found starting at index {}",std::distance(mainRange.begin(), rangesResult.begin()));// 预期输出: std::ranges::find_end: Sub - range found starting at index 4
    } else {fmt::println("std::ranges::find_end: Sub - range not found");
    }
    
  • find_first_of, ranges::find_first_of: 查找两个范围中第一个匹配的元素.

    std::vector<int> firstRange = {1, 2, 3, 4, 5};
    std::vector<int> secondRange = {3, 6, 7};
    // 使用 std::find_first_of
    auto stdResult = std::find_first_of(firstRange.begin(), firstRange.end(),secondRange.begin(), secondRange.end());
    if (stdResult != firstRange.end()) {fmt::println("std::find_first_of: Found matching element {} at index {}",*stdResult, std::distance(firstRange.begin(), stdResult));// 预期输出: std::find_first_of: Found matching element 3 at index 2
    } else {fmt::println("std::find_first_of: No matching element found");
    }// 使用 std::ranges::find_first_of
    auto rangesResult = std::ranges::find_first_of(firstRange, secondRange);
    if (rangesResult != firstRange.end()) {fmt::println("std::ranges::find_first_of: Found matching element {} at index {}",*rangesResult, std::distance(firstRange.begin(), rangesResult));// 预期输出: std::ranges::find_first_of: Found matching element 3 at index 2
    } else {fmt::println("std::ranges::find_first_of: No matching element found");
    }
    
  • adjacent_find, ranges::adjacent_find: 查找范围内相邻且相等的元素.

    std::vector<int> numbers = {1, 2, 2, 3, 4};
    // 使用 std::adjacent_find
    auto stdResult = std::adjacent_find(numbers.begin(), numbers.end());
    if (stdResult != numbers.end()) {fmt::println("std::adjacent_find: Adjacent equal elements {} found at index {}",*stdResult, std::distance(numbers.begin(), stdResult));// 预期输出: std::adjacent_find: Adjacent equal elements 2 found at index 1
    } else {fmt::println("std::adjacent_find: No adjacent equal elements found");
    }// 使用 std::ranges::adjacent_find
    auto rangesResult = std::ranges::adjacent_find(numbers);
    if (rangesResult != numbers.end()) {fmt::println("std::ranges::adjacent_find: Adjacent equal elements {} found at index ""{}",*rangesResult, std::distance(numbers.begin(), rangesResult));// 预期输出: std::ranges::adjacent_find: Adjacent equal elements 2 found at// index 1
    } else {fmt::println("std::ranges::adjacent_find: No adjacent equal elements found");
    }
    

计数

  • count, ranges::count: 统计等于指定值的元素个数.

    constexpr std::array v = {1, 2, 3, 3, 4, 5};// count
    fmt::println("Count of 3: {}", std::count(v.begin(), v.end(), 3));
    // Count of 3: 2// ranges::count
    fmt::println("Count of 3 (ranges): {}", std::ranges::count(v, 3));
    // Count of 3 (ranges): 2
    
  • count_if, ranges::count_if: 统计满足条件的元素个数.

    constexpr std::array v = {1, 2, 3, 3, 4, 5};
    // count_if
    fmt::println("Count of elements greater than 3: {}",std::count_if(v.begin(), v.end(), [](int n) { return n > 3; }));
    // Count of elements greater than 3: 2// ranges::count_if
    fmt::println("Count of elements greater than 3 (ranges): {}\n",std::ranges::count_if(v, [](int n) { return n > 3; }));
    // Count of elements greater than 3 (ranges): 2
    

比较

  • mismatch, ranges::mismatch: 找到两个范围中第一个不匹配的元素.

    std::vector<int> first = {1, 2, 3, 4, 5};
    std::vector<int> second = {1, 2, 6, 4, 5};// 使用 std::mismatch
    auto stdMismatch = std::mismatch(first.begin(), first.end(), second.begin());
    if (stdMismatch.first != first.end()) {fmt::println("std::mismatch: First mismatch at index {}, values: {} and {}",std::distance(first.begin(), stdMismatch.first),*stdMismatch.first, *stdMismatch.second);// 预期输出: std::mismatch: First mismatch at index 2, values: 3 and 6
    } else {fmt::println("std::mismatch: No mismatch found");
    }// 使用 std::ranges::mismatch
    auto rangesMismatch = std::ranges::mismatch(first, second);
    if (rangesMismatch.in1 != first.end()) {fmt::println("std::ranges::mismatch: First mismatch at index {}, values: {} and {}",std::distance(first.begin(), rangesMismatch.in1), *rangesMismatch.in1,*rangesMismatch.in2);// 预期输出: std::ranges::mismatch: First mismatch at index 2, values: 3 and// 6
    } else {fmt::println("std::ranges::mismatch: No mismatch found");
    }
    
  • equal, ranges::equal: 比较两个范围是否相等.

    std::vector<int> first = {1, 2, 3};
    std::vector<int> second = {1, 2, 3};// 使用 std::equal
    bool stdEqual = std::equal(first.begin(), first.end(), second.begin());
    fmt::println("std::equal: {}", stdEqual);
    // 预期输出: std::equal: truestd::vector<int> third = {1, 2, 4};
    stdEqual = std::equal(first.begin(), first.end(), third.begin());
    fmt::println("std::equal (different): {}", stdEqual);
    // 预期输出: std::equal (different): false// 使用 std::ranges::equal
    bool rangesEqual = std::ranges::equal(first, second);
    fmt::println("std::ranges::equal: {}", rangesEqual);
    // 预期输出: std::ranges::equal: truerangesEqual = std::ranges::equal(first, third);
    fmt::println("std::ranges::equal (different): {}", rangesEqual);
    // 预期输出: std::ranges::equal (different): false
    
  • search, ranges::search: 在一个范围中查找另一个范围第一次出现的位置.

    std::vector<int> mainRange = {1, 2, 3, 4, 5, 1, 2, 3};
    std::vector<int> subRange = {1, 2, 3};// 使用 std::search
    auto stdSearch = std::search(mainRange.begin(), mainRange.end(),subRange.begin(), subRange.end());
    if (stdSearch != mainRange.end()) {fmt::println("std::search: Sub - range found starting at index {}",std::distance(mainRange.begin(), stdSearch));// 预期输出: std::search: Sub - range found starting at index 0
    } else {fmt::println("std::search: Sub - range not found");
    }// 使用 std::ranges::search
    auto rangesSearch = std::ranges::search(mainRange, subRange);
    if (rangesSearch.begin() != mainRange.end()) {fmt::println("std::ranges::search: Sub - range found starting at index {}",std::distance(mainRange.begin(), rangesSearch.begin()));// 预期输出: std::ranges::search: Sub - range found starting at index 0
    } else {fmt::println("std::ranges::search: Sub - range not found");
    }
    
  • search_n, ranges::search_n: 在一个范围中查找连续 n 个等于指定值的元素.

    std::vector<int> numbers = {1, 2, 2, 2, 3, 4};
    int value = 2;
    int count = 3;// 使用 std::search_n
    auto stdSearchN = std::search_n(numbers.begin(), numbers.end(), count, value);
    if (stdSearchN != numbers.end()) {fmt::println("std::search_n: Sequence of {} {}s found starting at index {}",count, value, std::distance(numbers.begin(), stdSearchN));// 预期输出: std::search_n: Sequence of 3 2s found starting at index 1
    } else {fmt::println("std::search_n: Sequence not found");
    }// 使用 std::ranges::search_n
    auto rangesSearchN = std::ranges::search_n(numbers, count, value);
    if (rangesSearchN.begin() != numbers.end()) {fmt::println("std::ranges::search_n: Sequence of {} {}s found starting at index {}",count, value, std::distance(numbers.begin(), rangesSearchN.begin()));// 预期输出: std::ranges::search_n: Sequence of 3 2s found starting at index// 1
    } else {fmt::println("std::ranges::search_n: Sequence not found");
    }
    
  • ranges::starts_with: 检查一个范围是否以另一个范围开头.

    #ifdef _MSC_VER
    std::vector<int> mainRange = {1, 2, 3, 4, 5};
    std::vector<int> startRange = {1, 2, 3};bool startsWith = std::ranges::starts_with(mainRange, startRange);
    fmt::println("std::ranges::starts_with: {}", startsWith);
    // 预期输出: std::ranges::starts_with: truestd::vector<int> wrongStartRange = {2, 3, 4};
    startsWith = std::ranges::starts_with(mainRange, wrongStartRange);
    fmt::println("std::ranges::starts_with (wrong): {}", startsWith);
    // 预期输出: std::ranges::starts_with (wrong): false
    #endif
    
  • ranges::ends_with: 检查一个范围是否以另一个范围结尾.

    #ifdef _MSC_VER
    std::vector<int> mainRange = {1, 2, 3, 4, 5};
    std::vector<int> endRange = {3, 4, 5};bool endsWith = std::ranges::ends_with(mainRange, endRange);
    fmt::println("std::ranges::ends_with: {}", endsWith);
    // 预期输出: std::ranges::ends_with: truestd::vector<int> wrongEndRange = {4, 5, 6};
    endsWith = std::ranges::ends_with(mainRange, wrongEndRange);
    fmt::println("std::ranges::ends_with (wrong): {}", endsWith);
    // 预期输出: std::ranges::ends_with (wrong): false
    #endif
    

Fold operations (C++23)

  • ranges::fold_left(C++23): 从左到右折叠范围中的元素.
  • ranges::fold_left_first(C++23): 从左到右折叠范围中的元素, 初始值为范围的第一个元素.
  • ranges::fold_right(C++23): 从右到左折叠范围中的元素.
  • ranges::fold_right_last(C++23): 从右到左折叠范围中的元素, 初始值为范围的最后一个元素.
  • ranges::fold_left_with_iter(C++23): 从左到右折叠范围中的元素, 并返回迭代器.
  • ranges::fold_left_first_with_iter(C++23): 从左到右折叠范围中的元素, 初始值为范围的第一个元素, 并返回迭代器.

修改序列

这些算法会修改容器或范围中的元素.

拷贝和移动

  • copy, ranges::copy: 将一个范围的元素拷贝到另一个范围.

    std::vector source = {1, 2, 3, 4, 5};
    std::vector<int> destination(5);// 使用 std::copy
    std::copy(source.begin(), source.end(), destination.begin());
    fmt::println("std::copy: {}", destination);
    // 预期输出: std::copy: [1, 2, 3, 4, 5]source = {1, 2, 3, 4, 5};
    destination.resize(5);
    // 使用 std::ranges::copy
    std::ranges::copy(source, destination.begin());
    fmt::println("std::ranges::copy: {}", destination);
    // 预期输出: std::ranges::copy: [1, 2, 3, 4, 5]
    
  • copy_if, ranges::copy_if: 拷贝满足条件的元素.

    std::vector source = {1, 2, 3, 4, 5};
    std::vector<int> destination;
    auto isEven = [](int num) { return num % 2 == 0; };// 使用 std::copy_if
    std::copy_if(source.begin(), source.end(), std::back_inserter(destination),isEven);
    fmt::println("std::copy_if: {}", destination);
    // 预期输出: std::copy_if: [2, 4]source = {1, 2, 3, 4, 5};
    destination.clear();
    // 使用 std::ranges::copy_if
    std::ranges::copy_if(source, std::back_inserter(destination), isEven);
    fmt::println("std::ranges::copy_if: {}", destination);
    // 预期输出: std::ranges::copy_if: [2, 4]
    
  • copy_n, ranges::copy_n: 拷贝指定个数的元素.

    std::vector source = {1, 2, 3, 4, 5};
    std::vector<int> destination(3);// 使用 std::copy_n
    std::copy_n(source.begin(), 3, destination.begin());
    fmt::println("std::copy_n: {}", destination);
    // 预期输出: std::copy_n: [1, 2, 3]source = {1, 2, 3, 4, 5};
    destination.resize(3);
    // 使用 std::ranges::copy_n
    std::ranges::copy_n(source.begin(), 3, destination.begin());
    fmt::println("std::ranges::copy_n: {}", destination);
    // 预期输出: std::ranges::copy_n: [1, 2, 3]
    
  • copy_backward, ranges::copy_backward: 从后往前拷贝元素.

    std::vector source = {1, 2, 3, 4, 5};
    std::vector<int> destination(5);// 使用 std::copy_backward
    std::copy_backward(source.begin(), source.end(), destination.end());
    fmt::println("std::copy_backward: {}", destination);
    // 预期输出: std::copy_backward: [1, 2, 3, 4, 5]source = {1, 2, 3, 4, 5};
    destination.resize(5);
    // 使用 std::ranges::copy_backward
    std::ranges::copy_backward(source, destination.end());
    fmt::println("std::ranges::copy_backward: {}", destination);
    // 预期输出: std::ranges::copy_backward: [1, 2, 3, 4, 5]
    
  • move, ranges::move: 将元素从一个范围移动到另一个范围.

    std::vector<int> source = {1, 2, 3, 4, 5};
    std::vector<int> destination(5);// 使用 std::move
    std::move(source.begin(), source.end(), destination.begin());
    fmt::println("std::move: {}", destination);
    // 预期输出: std::move: [1, 2, 3, 4, 5]source = {1, 2, 3, 4, 5};
    destination.resize(5);
    // 使用 std::ranges::move
    std::ranges::move(source, destination.begin());
    fmt::println("std::ranges::move: {}", destination);
    // 预期输出: std::ranges::move: [1, 2, 3, 4, 5]
    
  • move_backward, ranges::move_backward: 从后往前移动元素.

    std::vector<int> source = {1, 2, 3, 4, 5};
    std::vector<int> destination(5);// 使用 std::move_backward
    std::move_backward(source.begin(), source.end(), destination.end());
    fmt::println("std::move_backward: {}", destination);
    // 预期输出: std::move_backward: [1, 2, 3, 4, 5]source = {1, 2, 3, 4, 5};
    destination.resize(5);
    // 使用 std::ranges::move_backward
    std::ranges::move_backward(source, destination.end());
    fmt::println("std::ranges::move_backward: {}", destination);
    // 预期输出: std::ranges::move_backward: [1, 2, 3, 4, 5]
    

交换操作

  • swap: 交换两个值.

    int a = 5, b = 10;
    std::swap(a, b);
    fmt::println("std::swap: a = {}, b = {}", a, b);
    // 预期输出: std::swap: a = 10, b = 5
    
  • swap_ranges, ranges::swap_ranges: 交换两个范围的元素.

    std::vector first = {1, 2, 3};
    std::vector second = {4, 5, 6};
    // 使用 std::swap_ranges
    std::swap_ranges(first.begin(), first.end(), second.begin());
    fmt::println("std::swap_ranges: first = {}, second = {}", first, second);
    // 预期输出: std::swap_ranges: first = [4, 5, 6], second = [1, 2, 3]first = {1, 2, 3};
    second = {4, 5, 6};
    // 使用 std::ranges::swap_ranges
    std::ranges::swap_ranges(first, second);
    fmt::println("std::ranges::swap_ranges: first = {}, second = {}", first,second);
    // 预期输出: std::ranges::swap_ranges: first = [4, 5, 6], second = [1, 2, 3]
    
  • iter_swap: 交换两个迭代器所指向的元素.

    std::vector numbers = {1, 2, 3, 4, 5};
    auto iter1 = numbers.begin();
    auto iter2 = numbers.begin() + 2;
    // 使用 std::iter_swap
    std::iter_swap(iter1, iter2);
    fmt::println("std::iter_swap: {}", numbers);
    // 预期输出: std::iter_swap: [3, 2, 1, 4, 5]
    

变换操作

变换

  • transform, ranges::transform: 对范围内的每个元素应用函数, 并将结果存储到另一个范围.
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::vector<int> result(numbers.size());// 使用 transform 将每个元素乘以 2 并存储到 result 中
std::transform(numbers.begin(), numbers.end(), result.begin(),[](int num) { return num * 2; });// 使用 ranges::transform 做同样的操作
std::vector<int> resultRanges(numbers.size());
std::ranges::transform(numbers, resultRanges.begin(),[](int num) { return num * 2; });// 输出 transform 的结果
fmt::print("transform 结果: {}\n", result);// 输出 ranges::transform 的结果
fmt::print("ranges::transform 结果: {}\n", resultRanges);

替换

  • replace, ranges::replace: 将范围内的指定值替换为新值.

    std::vector v = {1, 2, 3, 2, 4, 2};
    // 使用 std::replace
    std::replace(v.begin(), v.end(), 2, 9);
    fmt::println("std::replace: {}", v);
    // 预期输出: std::replace: [1, 9, 3, 9, 4, 9]v = {1, 2, 3, 2, 4, 2};
    // 使用 std::ranges::replace
    std::ranges::replace(v, 2, 9);
    fmt::println("std::ranges::replace: {}", v);
    // 预期输出: std::ranges::replace: [1, 9, 3, 9, 4, 9]
    
  • replace_if, ranges::replace_if: 替换满足条件的元素.

    std::vector v = {1, 2, 3, 4, 5, 6};
    auto is_odd = [](int num) { return num % 2 == 0; };
    // 使用 std::replace_if
    std::replace_if(v.begin(), v.end(), is_odd, 0);
    fmt::println("std::replace_if: {}", v);
    // 预期输出: std::replace_if: [1, 0, 3, 0, 5, 0]v = {1, 2, 3, 4, 5, 6};
    // 使用 std::ranges::replace_if
    std::ranges::replace_if(v, is_odd, 0);
    fmt::println("std::ranges::replace_if: {}", v);
    // 预期输出: std::ranges::replace_if: [1, 0, 3, 0, 5, 0]
    
  • replace_copy, ranges::replace_copy: 拷贝范围中的元素, 同时将指定值替换为新值.

    std::vector v = {1, 2, 3, 2, 4, 2};
    std::vector<int> result(v.size());
    // 使用 std::replace_copy
    std::replace_copy(v.begin(), v.end(), result.begin(), 2, 9);
    fmt::println("std::replace_copy: {}", result);
    // 预期输出: std::replace_copy: [1, 9, 3, 9, 4, 9]v = {1, 2, 3, 2, 4, 2};
    result.clear();
    result.resize(v.size());
    // 使用 std::ranges::replace_copy
    std::ranges::replace_copy(v, result.begin(), 2, 9);
    fmt::println("std::ranges::replace_copy: {}", result);
    // 预期输出: std::ranges::replace_copy: [1, 9, 3, 9, 4, 9]
    
  • replace_copy_if, ranges::replace_copy_if: 拷贝范围中的元素, 同时将满足条件的元素替换为新值.

    std::vector<int> v = {1, 2, 3, 4, 5, 6};
    std::vector<int> result(v.size());
    // 使用 std::replace_copy_if
    std::replace_copy_if(v.begin(), v.end(), result.begin(), [](int num) { return num % 2 == 0; },0);
    fmt::println("std::replace_copy_if: {}", result);
    // 预期输出: std::replace_copy_if: [1, 0, 3, 0, 5, 0]v = {1, 2, 3, 4, 5, 6};
    result.clear();
    result.resize(v.size());
    // 使用 std::ranges::replace_copy_if
    std::ranges::replace_copy_if(v, result.begin(), [](int num) { return num % 2 == 0; }, 0);
    fmt::println("std::ranges::replace_copy_if: {}", result);
    // 预期输出: std::ranges::replace_copy_if: [1, 0, 3, 0, 5, 0]
    

生成操作

  • fill, ranges::fill: 将范围内所有元素赋值为指定值.

    std::vector<int> v(6);
    // 使用 std::fill
    std::fill(v.begin(), v.end(), 9);
    fmt::println("std::fill: {}", v);
    // 预期输出: std::fill: [9, 9, 9, 9, 9, 9]v.resize(6);
    // 使用 std::ranges::fill
    std::ranges::fill(v, 9);
    fmt::println("std::ranges::fill: {}", v);
    // 预期输出: std::ranges::fill: [9, 9, 9, 9, 9, 9]
    
  • fill_n, ranges::fill_n: 对指定个数的元素赋值.

    std::vector<int> v(6);
    // 使用 std::fill_n
    std::fill_n(v.begin(), 3, 5);
    fmt::println("std::fill_n: {}",v);  // 预期输出: std::fill_n: [5, 5, 5, 0, 0, 0]v.resize(6);
    // 使用 std::ranges::fill_n
    std::ranges::fill_n(v.begin(), 3, 5);
    fmt::println("std::ranges::fill_n: {}",v);  // 预期输出: std::ranges::fill_n: [5, 5, 5, 0, 0, 0]
    
  • generate, ranges::generate: 使用函数生成范围内的值.

    std::vector<int> v(6);
    int counter = 1;
    auto generator = [&counter]() { return counter++; };
    // 使用 std::generate
    std::generate(v.begin(), v.end(), generator);
    fmt::println("std::generate: {}",v);  // 预期输出: std::generate: [1, 2, 3, 4, 5, 6]v.resize(6);
    counter = 1;
    // 使用 std::ranges::generate
    std::ranges::generate(v, generator);
    fmt::println("std::ranges::generate: {}",v);  // 预期输出: std::ranges::generate: [1, 2, 3, 4, 5, 6]
    
  • generate_n, ranges::generate_n: 为前 N 个元素生成值.

    std::vector<int> v(6);
    int counter = 1;
    auto generator = [&counter]() { return counter++; };
    // 使用 std::generate_n
    std::generate_n(v.begin(), 3, generator);
    fmt::println("std::generate_n: {}",v);  // 预期输出: std::generate_n: [1, 2, 3, 0, 0, 0]v.resize(6);
    counter = 1;
    // 使用 std::ranges::generate_n
    std::ranges::generate_n(v.begin(), 3, generator);
    fmt::println("std::ranges::generate_n: {}",v);  // 预期输出: std::ranges::generate_n: [1, 2, 3, 0, 0, 0]
    

移除操作

  • remove, ranges::remove: 移除指定值的元素(逻辑移除, 不改变容器大小).

    std::vector<int> src = {1, 2, 3, 2, 4, 2};
    // 使用 std::remove
    auto newEnd = std::remove(src.begin(), src.end(), 2);
    fmt::println("std::remove: {}", std::vector<int>(src.begin(), newEnd));
    // 预期输出: std::remove: [1, 3, 4]src = {1, 2, 3, 2, 4, 2};
    // 使用 std::ranges::remove
    auto result = std::ranges::remove(src, 2);
    src.erase(result.begin(), result.end());
    fmt::println("std::ranges::remove: {}", src);
    // 预期输出: std::ranges::remove: [1, 3, 4]
    
  • remove_if, ranges::remove_if: 移除满足条件的元素(逻辑移除, 不改变容器大小).

    std::vector<int> src = {1, 2, 3, 4, 5, 6};
    // 使用 std::remove_if
    auto newEnd = std::remove_if(src.begin(), src.end(),[](int num) { return num % 2 == 0; });
    fmt::println("std::remove_if: {}", std::vector<int>(src.begin(), newEnd));
    // 预期输出: std::remove_if: [1, 3, 5]src = {1, 2, 3, 4, 5, 6};
    // 使用 std::ranges::remove_if
    auto result =std::ranges::remove_if(src, [](int num) { return num % 2 == 0; });
    src.erase(result.begin(), result.end());
    fmt::println("std::ranges::remove_if: {}", src);
    // 预期输出: std::ranges::remove_if: [1, 3, 5]
    
  • remove_copy, ranges::remove_copy: 拷贝范围中的元素, 同时移除指定值的元素.

    std::vector<int> src = {1, 2, 3, 2, 4, 2};
    std::vector<int> result;
    // 使用 std::remove_copy
    std::remove_copy(src.begin(), src.end(), std::back_inserter(result), 2);
    fmt::println("std::remove_copy: {}", result);
    // 预期输出: std::remove_copy: [1, 3, 4]src = {1, 2, 3, 2, 4, 2};
    result.clear();
    // 使用 std::ranges::remove_copy
    std::ranges::remove_copy(src, std::back_inserter(result), 2);
    fmt::println("std::ranges::remove_copy: {}", result);
    // 预期输出: std::ranges::remove_copy: [1, 3, 4]
    
  • remove_copy_if, ranges::remove_copy_if: 拷贝范围中的元素, 同时移除满足条件的元素.

    std::vector<int> src = {1, 2, 3, 4, 5, 6};
    std::vector<int> result;
    // 使用 std::remove_copy_if
    std::remove_copy_if(src.begin(), src.end(), std::back_inserter(result),[](int num) { return num % 2 == 0; });
    fmt::println("std::remove_copy_if: {}", result);
    // 预期输出: std::remove_copy_if: [1, 3, 5]src = {1, 2, 3, 4, 5, 6};
    result.clear();
    // 使用 std::ranges::remove_copy_if
    std::ranges::remove_copy_if(src, std::back_inserter(result),[](int num) { return num % 2 == 0; });
    fmt::println("std::ranges::remove_copy_if: {}", result);
    // 预期输出: std::ranges::remove_copy_if: [1, 3, 5]
    
  • unique, ranges::unique: 移除相邻的重复元素(逻辑移除, 不改变容器大小).

    std::vector<int> src = {1, 1, 2, 2, 3, 3};
    // 使用 std::unique
    auto newEnd = std::unique(src.begin(), src.end());
    fmt::println("std::unique: {}", std::vector<int>(src.begin(), newEnd));
    // 预期输出: std::unique: [1, 2, 3]src = {1, 1, 2, 2, 3, 3};
    // 使用 std::ranges::unique
    auto result = std::ranges::unique(src);
    src.erase(result.begin(), result.end());
    fmt::println("std::ranges::unique: {}", src);
    // 预期输出: std::ranges::unique: [1, 2, 3]
    
  • unique_copy, ranges::unique_copy: 拷贝范围中的元素, 同时移除相邻的重复元素.

    std::vector<int> src = {1, 1, 2, 2, 3, 3};
    std::vector<int> result;
    // 使用 std::unique_copy
    std::unique_copy(src.begin(), src.end(), std::back_inserter(result));
    fmt::println("std::unique_copy: {}", result);
    // 预期输出: std::unique_copy: [1, 2, 3]src = {1, 1, 2, 2, 3, 3};
    result.clear();
    // 使用 std::ranges::unique_copy
    std::ranges::unique_copy(src, std::back_inserter(result));
    fmt::println("std::ranges::unique_copy: {}", result);
    // 预期输出: std::ranges::unique_copy: [1, 2, 3]
    

改变顺序的操作

  • reverse, ranges::reverse: 反转范围内的元素顺序.

    std::vector vec = {1, 2, 3, 4, 5};
    fmt::println("Original vector for reverse: {}", vec);
    // 预期输出: Original vector for reverse: [1, 2, 3, 4, 5]
    std::reverse(vec.begin(), vec.end());
    fmt::println("After std::reverse: {}", vec);
    // 预期输出: After std::reverse: [5, 4, 3, 2, 1]
    
  • reverse_copy, ranges::reverse_copy: 反转范围内的元素顺序并拷贝到另一个范围.

    std::vector vec = {1, 2, 3, 4, 5};
    std::vector<int> result(vec.size());
    fmt::println("Original vector for reverse_copy: {}", vec);
    // 预期输出: Original vector for reverse_copy: [1, 2, 3, 4, 5]
    std::reverse_copy(vec.begin(), vec.end(), result.begin());
    fmt::println("After std::reverse_copy: {}", result);
    // 预期输出: After std::reverse_copy: [5, 4, 3, 2, 1]
    
  • rotate, ranges::rotate: 旋转范围内的元素.

    std::vector vec = {1, 2, 3, 4, 5};
    fmt::println("Original vector for rotate: {}", vec);
    // 预期输出: Original vector for rotate: [1, 2, 3, 4, 5]
    std::rotate(vec.begin(), vec.begin() + 2, vec.end());
    fmt::println("After std::rotate (rotate by 2): {}", vec);
    // 预期输出: After std::rotate (rotate by 2): [3, 4, 5, 1, 2]
    
  • rotate_copy, ranges::rotate_copy: 旋转范围内的元素并拷贝到另一个范围.

    std::vector vec = {1, 2, 3, 4, 5};
    std::vector<int> result(vec.size());
    fmt::println("Original vector for rotate_copy: {}", vec);
    // 预期输出: Original vector for rotate_copy: [1, 2, 3, 4, 5]
    std::rotate_copy(vec.begin(), vec.begin() + 2, vec.end(), result.begin());
    fmt::println("After std::rotate_copy (rotate by 2): {}", result);
    // 预期输出: After std::rotate_copy (rotate by 2): [3, 4, 5, 1, 2]
    
  • shift_left, ranges::shift_left: 向左移动范围内的元素.

    std::vector<int> vec = {1, 2, 3, 4, 5};
    fmt::println("Original vector for shift_left: {}", vec);
    // 预期输出: Original vector for shift_left: [1, 2, 3, 4, 5]
    auto new_end = std::shift_left(vec.begin(), vec.end(), 2);
    vec.erase(new_end, vec.end());
    vec.resize(5);
    fmt::println("After std::shift_left (shift by 2): {}", vec);
    // 预期输出: After std::shift_left (shift by 2): [3, 4, 5, 0, 0]
    
    #ifdef _MSC_VER
    std::vector<int> vec = {1, 2, 3, 4, 5};
    fmt::println("Original vector for ranges::shift_left: {}", vec);
    // 预期输出: Original vector for ranges::shift_left: [1, 2, 3, 4, 5]
    auto r_new_end = std::ranges::shift_left(vec, 2);
    vec.erase(r_new_end.begin(), r_new_end.end());
    vec.resize(5);
    fmt::println("After std::ranges::shift_left (shift by 2): {}", vec);
    // 预期输出: After std::ranges::shift_left (shift by 2): [3, 4, 5, 0, 0]
    #endif
    
  • shift_right, ranges::shift_right: 向右移动范围内的元素.

    std::vector<int> vec = {1, 2, 3, 4, 5};
    fmt::println("Original vector for shift_right: {}", vec);
    // 预期输出: Original vector for shift_right: [1, 2, 3, 4, 5]
    auto new_end = std::shift_right(vec.begin(), vec.end(), 2);
    vec.erase(new_end, vec.end());
    vec.resize(5);
    fmt::println("After std::shift_right (shift by 2): {}", vec);
    // 预期输出: After std::shift_right (shift by 2): [0, 0, 1, 2, 3]
    
    #ifdef _MSC_VER
    std::vector<int> vec = {1, 2, 3, 4, 5};
    fmt::println("Original vector for ranges::shift_right: {}", vec);
    // 预期输出: Original vector for ranges::shift_right: [1, 2, 3, 4, 5]
    auto r_new_end = std::ranges::shift_right(vec, 2);
    vec.erase(r_new_end.begin(), r_new_end.end());
    vec.resize(5);
    fmt::println("After std::ranges::shift_right (shift by 2): {}", vec);
    // 预期输出: After std::ranges::shift_right (shift by 2): [0, 0, 1, 2, 3]
    #endif
    
  • shuffle, ranges::shuffle: 随机打乱范围内的元素.

  • random_shuffle: 随机打乱范围内的元素(C++17 删除该特性).

// shuffle
void shuffleExample() {std::vector<int> vec = {1, 2, 3, 4, 5};std::random_device rd;std::mt19937 g(rd());fmt::println("Original vector for shuffle: {}", vec);// 预期输出: Original vector for shuffle: [1, 2, 3, 4, 5]std::shuffle(vec.begin(), vec.end(), g);fmt::println("After std::shuffle: {}", vec);  // 预期输出: 随机打乱后的向量
}// ranges::shuffle
void rangesShuffleExample() {std::vector<int> vec = {1, 2, 3, 4, 5};std::random_device rd;std::mt19937 g(rd());fmt::println("Original vector for ranges::shuffle: {}", vec);// 预期输出: Original vector for ranges::shuffle: [1, 2, 3, 4, 5]std::ranges::shuffle(vec, g);fmt::println("After std::ranges::shuffle: {}",vec);  // 预期输出: 随机打乱后的向量
}

抽样操作

  • sample, ranges::sample: 从范围中随机抽样.

    constexpr std::array v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    std::vector<int> result(3);  // 抽样结果存储的容器// 创建随机数引擎
    std::random_device rd;
    std::mt19937 gen(rd());// 使用 std::sample
    std::sample(v.begin(), v.end(), result.begin(), 3, gen);
    fmt::println("std::sample: {}", result);// 使用 std::ranges::sample
    std::ranges::sample(v, result.begin(), 3, gen);
    fmt::println("std::ranges::sample: {}", result);
    

partition 操作

  • is_partitioned, ranges::is_partitioned: 检查范围是否已被分区.

    std::vector v = {1, 3, 5, 2, 4, 6};
    auto is_even = [](int num) { return num % 2 == 0; };
    // 使用 std::is_partitioned
    bool stdIsPartitioned = std::is_partitioned(v.begin(), v.end(), is_even);
    fmt::println("std::is_partitioned: {}", stdIsPartitioned);
    // 预期输出: std::is_partitioned: falsev = {2, 4, 6, 1, 3, 5};
    // 使用 std::ranges::is_partitioned
    bool rangesIsPartitioned = std::ranges::is_partitioned(v, is_even);
    fmt::println("std::ranges::is_partitioned: {}", rangesIsPartitioned);
    // 预期输出: std::ranges::is_partitioned: true
    
  • partition, ranges::partition: 将范围中的元素按照条件分区.

    std::vector v = {1, 2, 3, 4, 5, 6};
    auto is_even = [](int num) { return num % 2 == 0; };
    // 使用 std::partition
    auto stdPartitionEnd = std::partition(v.begin(), v.end(), is_even);
    fmt::println("std::partition: {}",std::vector<int>(v.begin(), stdPartitionEnd));
    // 预期输出: 满足条件的元素组成的向量(顺序可能不同)
    fmt::println("std::partition rest: {}",std::vector<int>(stdPartitionEnd, v.end()));
    // 预期输出: 不满足条件的元素组成的向量(顺序可能不同)v = {1, 2, 3, 4, 5, 6};
    // 使用 std::ranges::partition
    auto result = std::ranges::partition(v, is_even);
    fmt::println("std::ranges::partition: {}",std::vector<int>(v.begin(), result.begin()));
    // 预期输出: 满足条件的元素组成的向量(顺序可能不同)
    fmt::println("std::ranges::partition rest: {}",std::vector<int>(result.begin(), v.end()));
    // 预期输出: 不满足条件的元素组成的向量(顺序可能不同)
    
  • partition_copy, ranges::partition_copy: 将范围中的元素按照条件分区并拷贝到两个不同的范围.

    std::vector<int> v = {1, 2, 3, 4, 5, 6};
    std::vector<int> trueResult, falseResult;
    auto is_even = [](int num) { return num % 2 == 0; };
    // 使用 std::partition_copy
    std::partition_copy(v.begin(), v.end(), std::back_inserter(trueResult),std::back_inserter(falseResult), is_even);
    fmt::println("std::partition_copy true: {}", trueResult);
    // 预期输出: 满足条件的元素组成的向量
    fmt::println("std::partition_copy false: {}", falseResult);
    // 预期输出: 不满足条件的元素组成的向量v = {1, 2, 3, 4, 5, 6};
    trueResult.clear();
    falseResult.clear();
    // 使用 std::ranges::partition_copy
    std::ranges::partition_copy(v, std::back_inserter(trueResult),std::back_inserter(falseResult), is_even);
    fmt::println("std::ranges::partition_copy true: {}", trueResult);
    // 预期输出: 满足条件的元素组成的向量
    fmt::println("std::ranges::partition_copy false: {}", falseResult);
    // 预期输出: 不满足条件的元素组成的向量
    
  • stable_partition, ranges::stable_partition: 将范围中的元素按照条件分区, 同时保持相对顺序.

    std::vector v = {1, 2, 3, 4, 5, 6};
    auto is_even = [](int num) { return num % 2 == 0; };
    // 使用 std::stable_partition
    auto stdStablePartitionEnd =std::stable_partition(v.begin(), v.end(), is_even);
    fmt::println("std::stable_partition: {}",std::vector<int>(v.begin(), stdStablePartitionEnd));
    // 预期输出: 满足条件的元素组成的向量(保持相对顺序)
    fmt::println("std::stable_partition rest: {}",std::vector<int>(stdStablePartitionEnd, v.end()));
    // 预期输出: 不满足条件的元素组成的向量(保持相对顺序)v = {1, 2, 3, 4, 5, 6};
    // 使用 std::ranges::stable_partition
    auto rangesStablePartitionResult = std::ranges::stable_partition(v, is_even);
    fmt::println("std::ranges::stable_partition: {}",std::vector<int>(v.begin(), rangesStablePartitionResult.begin()));
    // 预期输出: 满足条件的元素组成的向量(保持相对顺序)
    fmt::println("std::ranges::stable_partition rest: {}",std::vector<int>(rangesStablePartitionResult.begin(), v.end()));
    // 预期输出: 不满足条件的元素组成的向量(保持相对顺序)
    
  • partition_point, ranges::partition_point: 查找分区点.

    std::vector v = {2, 4, 6, 1, 3, 5};
    auto is_even = [](int num) { return num % 2 == 0; };
    // 使用 std::partition_point
    auto stdPartitionPoint = std::partition_point(v.begin(), v.end(), is_even);
    fmt::println("std::partition_point: {}", *stdPartitionPoint);
    // 预期输出: 分区点的元素值,这里是 1v = {2, 4, 6, 1, 3, 5};
    // 使用 std::ranges::partition_point
    auto rangesPartitionPoint = std::ranges::partition_point(v, is_even);
    fmt::println("std::ranges::partition_point: {}", *rangesPartitionPoint);
    // 预期输出: 分区点的元素值,这里是 1
    

排序相关算法

排序算法对范围中的元素重新排列.

  • sort, ranges::sort: 对范围内的元素进行升序排序.

    std::vector<int> numbers = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    // 使用 std::sort
    std::sort(numbers.begin(), numbers.end());
    fmt::println("std::sort: {}", numbers);
    // 预期输出: std::sort: [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]numbers = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    // 使用 std::ranges::sort
    std::ranges::sort(numbers);
    fmt::println("std::ranges::sort: {}", numbers);
    // 预期输出: std::ranges::sort: [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
    
  • stable_sort, ranges::stable_sort: 稳定排序, 保持相等元素的顺序.

    std::vector<int> numbers = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    // 使用 std::stable_sort
    std::stable_sort(numbers.begin(), numbers.end());
    fmt::println("std::stable_sort: {}", numbers);
    // 预期输出: 元素升序排列且相等元素相对顺序不变的向量,例如 [1, 1, 2, 3, 3, 4,
    // 5, 5, 5, 6, 9]numbers = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    // 使用 std::ranges::stable_sort
    std::ranges::stable_sort(numbers);
    fmt::println("std::ranges::stable_sort: {}", numbers);
    // 预期输出: 元素升序排列且相等元素相对顺序不变的向量,例如 [1, 1, 2, 3, 3, 4,
    // 5, 5, 5, 6, 9]
    
  • partial_sort, ranges::partial_sort: 对范围的前几个元素进行排序.

    std::vector<int> numbers = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    // 使用 std::partial_sort 对前 5 个元素排序
    std::partial_sort(numbers.begin(), numbers.begin() + 5, numbers.end());
    fmt::println("std::partial_sort: {}", numbers);
    // 预期输出: 前 5 个元素升序排列,后面元素无序,例如 [1, 1, 2, 3, 3, 9, 5, 6,
    // 5, 4, 5]numbers = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    // 使用 std::ranges::partial_sort 对前 5 个元素排序
    std::ranges::partial_sort(numbers.begin(), numbers.begin() + 5,numbers.end());
    fmt::println("std::ranges::partial_sort: {}", numbers);
    // 预期输出: 前 5 个元素升序排列,后面元素无序,例如 [1, 1, 2, 3, 3, 9, 5, 6,
    // 5, 4, 5]
    
  • partial_sort_copy, ranges::partial_sort_copy: 部分排序并拷贝.

    std::vector<int> numbers = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    std::vector<int> result(5);
    // 使用 std::partial_sort_copy
    std::partial_sort_copy(numbers.begin(), numbers.end(), result.begin(),result.end());
    fmt::println("std::partial_sort_copy: {}", result);
    // 预期输出: 原向量中最小的 5 个元素升序排列的向量,例如 [1, 1, 2, 3, 3]numbers = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    result.clear();
    result.resize(5);
    // 使用 std::ranges::partial_sort_copy
    std::ranges::partial_sort_copy(numbers, result);
    fmt::println("std::ranges::partial_sort_copy: {}", result);
    // 预期输出: 原向量中最小的 5 个元素升序排列的向量,例如 [1, 1, 2, 3, 3]
    
  • is_sorted, ranges::is_sorted: 检查范围是否已排序.

    std::vector<int> numbers = {1, 2, 3, 4, 5};
    // 使用 std::is_sorted
    bool stdIsSorted = std::is_sorted(numbers.begin(), numbers.end());
    fmt::println("std::is_sorted: {}", stdIsSorted);
    // 预期输出: std::is_sorted: truenumbers = {3, 1, 4};
    // 使用 std::ranges::is_sorted
    bool rangesIsSorted = std::ranges::is_sorted(numbers);
    fmt::println("std::ranges::is_sorted: {}", rangesIsSorted);
    // 预期输出: std::ranges::is_sorted: false
    
  • is_sorted_until, ranges::is_sorted_until: 查找范围中第一个未排序的元素.

    std::vector<int> numbers = {1, 2, 3, 1, 4};
    // 使用 std::is_sorted_until
    auto stdSortedUntil = std::is_sorted_until(numbers.begin(), numbers.end());
    fmt::println("std::is_sorted_until: {}", *stdSortedUntil);
    // 预期输出: std::is_sorted_until: 1numbers = {1, 2, 3, 1, 4};
    // 使用 std::ranges::is_sorted_until
    auto rangesSortedUntil = std::ranges::is_sorted_until(numbers);
    fmt::println("std::ranges::is_sorted_until: {}", *rangesSortedUntil);
    // 预期输出: std::ranges::is_sorted_until: 1
    
  • nth_element, ranges::nth_element: 将指定位置的元素调整到排序后的位置.

    std::vector<int> numbers = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    // 使用 std::nth_element 找到第 5 小的元素(索引为 4)
    std::nth_element(numbers.begin(), numbers.begin() + 4, numbers.end());
    fmt::println("std::nth_element: {}", numbers[4]);
    // 预期输出: 第 5 小的元素,例如 3numbers = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    // 使用 std::ranges::nth_element 找到第 5 小的元素(索引为 4)
    std::ranges::nth_element(numbers, numbers.begin() + 4);
    fmt::println("std::ranges::nth_element: {}", numbers[4]);
    // 预期输出: 第 5 小的元素,例如 3
    

二分查找

  • lower_bound, ranges::lower_bound: 找到第一个不小于指定值的位置.

    constexpr std::array vec = {1, 2, 4, 4, 5, 6, 7};
    constexpr int target = 4;
    // 使用 std::lower_bound
    fmt::println("std::lower_bound: {}",std::lower_bound(vec.begin(), vec.end(), target) - vec.begin());
    // 预期输出: std::lower_bound: 2// 使用 std::ranges::lower_bound
    fmt::println("std::ranges::lower_bound: {}",std::ranges::lower_bound(vec, target) - vec.begin());
    // 预期输出: std::ranges::lower_bound: 2
    
  • upper_bound, ranges::upper_bound: 找到第一个大于指定值的位置.

    constexpr std::array vec = {1, 2, 4, 4, 5, 6, 7};
    constexpr int target = 4;
    // 使用 std::upper_bound
    fmt::println("std::upper_bound: {}",std::upper_bound(vec.begin(), vec.end(), target) - vec.begin());
    // 预期输出: std::upper_bound: 4// 使用 std::ranges::upper_bound
    fmt::println("std::ranges::upper_bound: {}",std::ranges::upper_bound(vec, target) - vec.begin());
    // 预期输出: std::ranges::upper_bound: 4
    
  • equal_range, ranges::equal_range: 找到等于指定值的范围.

    constexpr std::array vec = {1, 2, 4, 4, 5, 6, 7};
    constexpr int target = 4;
    // 使用 std::equal_range
    auto stdEqualRange = std::equal_range(vec.begin(), vec.end(), target);
    fmt::println("std::equal_range: [{}, {}]", stdEqualRange.first - vec.begin(),stdEqualRange.second - vec.begin());
    // 预期输出: std::equal_range: [2, 4]// 使用 std::ranges::equal_range
    auto rangesEqualRange = std::ranges::equal_range(vec, target);
    fmt::println("std::ranges::equal_range: [{}, {}]",rangesEqualRange.begin() - vec.begin(),rangesEqualRange.end() - vec.begin());
    // 预期输出: std::ranges::equal_range: [2, 4]
    
  • binary_search, ranges::binary_search: 检查范围内是否包含指定值(范围必须有序).

    constexpr std::array vec = {1, 2, 4, 4, 5, 6, 7};
    constexpr int target1 = 4;
    constexpr int target2 = 3;
    // 使用 std::binary_search
    fmt::println("std::binary_search for {}: {}", target1,std::binary_search(vec.begin(), vec.end(), target1));
    // 预期输出: std::binary_search for 4: true
    fmt::println("std::binary_search for {}: {}", target2,std::binary_search(vec.begin(), vec.end(), target2));
    // 预期输出: std::binary_search for 3: false// 使用 std::ranges::binary_search
    fmt::println("std::ranges::binary_search for {}: {}", target1,std::ranges::binary_search(vec, target1));
    // 预期输出: std::ranges::binary_search for 4: true
    fmt::println("std::ranges::binary_search for {}: {}", target2,std::ranges::binary_search(vec, target2));
    // 预期输出: std::ranges::binary_search for 3: false
    

集合操作

  • includes, ranges::includes: 检查一个范围是否包含另一个范围.

    constexpr std::array larger = {1, 2, 3, 4, 5, 6};
    constexpr std::array smaller = {2, 4, 6};
    // 使用 std::includes
    fmt::println("std::includes: {}",std::includes(larger.begin(), larger.end(), smaller.begin(),smaller.end()));
    // 预期输出: std::includes: true// 使用 std::ranges::includes
    fmt::println("std::ranges::includes: {}",std::ranges::includes(larger, smaller));
    // 预期输出: std::ranges::includes: true
    
  • set_union, ranges::set_union: 计算两个有序范围的并集.

    std::vector<int> first = {1, 3, 5, 7};
    std::vector<int> second = {2, 3, 6, 7};
    std::vector<int> result;
    // 使用 std::set_union
    std::set_union(first.begin(), first.end(), second.begin(), second.end(),std::back_inserter(result));
    fmt::println("std::set_union: {}", result);
    // 预期输出: std::set_union: [1, 2, 3, 5, 6, 7]first = {1, 3, 5, 7};
    second = {2, 3, 6, 7};
    result.clear();
    // 使用 std::ranges::set_union
    std::ranges::set_union(first, second, std::back_inserter(result));
    fmt::println("std::ranges::set_union: {}", result);
    // 预期输出: std::ranges::set_union: [1, 2, 3, 5, 6, 7]
    
  • set_intersection, ranges::set_intersection: 计算两个有序范围的交集.

    std::vector<int> first = {1, 3, 5, 7};
    std::vector<int> second = {2, 3, 6, 7};
    std::vector<int> result;
    // 使用 std::set_intersection
    std::set_intersection(first.begin(), first.end(), second.begin(),second.end(), std::back_inserter(result));
    fmt::println("std::set_intersection: {}", result);
    // 预期输出: std::set_intersection: [3, 7]first = {1, 3, 5, 7};
    second = {2, 3, 6, 7};
    result.clear();
    // 使用 std::ranges::set_intersection
    std::ranges::set_intersection(first, second, std::back_inserter(result));
    fmt::println("std::ranges::set_intersection: {}", result);
    // 预期输出: std::ranges::set_intersection: [3, 7]
    
  • set_difference, ranges::set_difference: 计算两个有序范围的差集.

    std::vector<int> first = {1, 3, 5, 7};
    std::vector<int> second = {2, 3, 6, 7};
    std::vector<int> result;
    // 使用 std::set_difference
    std::set_difference(first.begin(), first.end(), second.begin(), second.end(),std::back_inserter(result));
    fmt::println("std::set_difference: {}", result);
    // 预期输出: std::set_difference: [1, 5]first = {1, 3, 5, 7};
    second = {2, 3, 6, 7};
    result.clear();
    // 使用 std::ranges::set_difference
    std::ranges::set_difference(first, second, std::back_inserter(result));
    fmt::println("std::ranges::set_difference: {}", result);
    // 预期输出: std::ranges::set_difference: [1, 5]
    
  • set_symmetric_difference, ranges::set_symmetric_difference: 计算两个有序范围的对称差集.

    std::vector<int> first = {1, 3, 5, 7};
    std::vector<int> second = {2, 3, 6, 7};
    std::vector<int> result;
    // 使用 std::set_symmetric_difference
    std::set_symmetric_difference(first.begin(), first.end(), second.begin(),second.end(), std::back_inserter(result));
    fmt::println("std::set_symmetric_difference: {}", result);
    // 预期输出: std::set_symmetric_difference: [1, 2, 5, 6]first = {1, 3, 5, 7};
    second = {2, 3, 6, 7};
    result.clear();
    // 使用 std::ranges::set_symmetric_difference
    std::ranges::set_symmetric_difference(first, second,std::back_inserter(result));
    fmt::println("std::ranges::set_symmetric_difference: {}", result);
    // 预期输出: std::ranges::set_symmetric_difference: [1, 2, 5, 6]
    

Merge operations

  • merge, ranges::merge: 合并两个有序范围.

    constexpr std::array first = {1, 3, 5};
    constexpr std::array second = {2, 4, 6};
    std::vector<int> result;// 使用 std::merge
    std::merge(first.begin(), first.end(), second.begin(), second.end(),std::back_inserter(result));
    fmt::println("std::merge: {}", result);
    // 预期输出: std::merge: [1, 2, 3, 4, 5, 6]result.clear();
    // 使用 std::ranges::merge
    std::ranges::merge(first, second, std::back_inserter(result));
    fmt::println("std::ranges::merge: {}", result);
    // 预期输出: std::ranges::merge: [1, 2, 3, 4, 5, 6]
    
  • inplace_merge, ranges::inplace_merge: 原地合并两个有序范围.

    std::vector v = {1, 3, 5, 2, 4, 6};
    auto middle = v.begin() + 3;// 使用 std::inplace_merge
    std::inplace_merge(v.begin(), middle, v.end());
    fmt::println("std::inplace_merge: {}", v);
    // 预期输出: std::inplace_merge: [1, 2, 3, 4, 5, 6]v = {1, 3, 5, 2, 4, 6};
    middle = v.begin() + 3;
    // 使用 std::ranges::inplace_merge
    std::ranges::inplace_merge(v, middle);
    fmt::println("std::ranges::inplace_merge: {}", v);
    // 预期输出: std::ranges::inplace_merge: [1, 2, 3, 4, 5, 6]

堆操作

  • push_heap, ranges::push_heap: 将新元素插入堆.

    std::vector<int> heap = {3, 1, 2};
    // 先将范围转换为堆
    std::make_heap(heap.begin(), heap.end());
    // 插入新元素
    heap.push_back(4);
    // 使用 std::push_heap
    std::push_heap(heap.begin(), heap.end());
    fmt::println("std::push_heap: {}", heap);
    // 预期输出: std::push_heap: [4, 3, 2, 1]heap = {3, 1, 2};
    std::ranges::make_heap(heap);
    heap.push_back(4);
    // 使用 std::ranges::push_heap
    std::ranges::push_heap(heap);
    fmt::println("std::ranges::push_heap: {}", heap);
    // 预期输出: std::ranges::push_heap: [4, 3, 2, 1]
    
  • pop_heap, ranges::pop_heap: 从堆中移除最大元素.

    std::vector<int> heap = {4, 3, 2, 1};
    // 使用 std::pop_heap
    std::pop_heap(heap.begin(), heap.end());
    int popped = heap.back();
    heap.pop_back();
    fmt::println("std::pop_heap popped: {}, remaining: {}", popped, heap);
    // 预期输出: std::pop_heap popped: 4, remaining: [3, 1, 2]heap = {4, 3, 2, 1};
    // 使用 std::ranges::pop_heap
    std::ranges::pop_heap(heap);
    popped = heap.back();
    heap.pop_back();
    fmt::println("std::ranges::pop_heap popped: {}, remaining: {}", popped, heap);
    // 预期输出: std::ranges::pop_heap popped: 4, remaining: [3, 1, 2]
    
  • make_heap, ranges::make_heap: 将范围转换为堆.

    std::vector<int> numbers = {3, 1, 2};
    // 使用 std::make_heap
    std::make_heap(numbers.begin(), numbers.end());
    fmt::println("std::make_heap: {}", numbers);
    // 预期输出: std::make_heap: [3, 1, 2](可能形式,堆结构不唯一)numbers = {3, 1, 2};
    // 使用 std::ranges::make_heap
    std::ranges::make_heap(numbers);
    fmt::println("std::ranges::make_heap: {}", numbers);
    // 预期输出: std::ranges::make_heap: [3, 1, 2](可能形式,堆结构不唯一)
    
  • sort_heap, ranges::sort_heap: 对堆排序.

    std::vector<int> heap = {4, 3, 2, 1};
    // 使用 std::sort_heap
    std::sort_heap(heap.begin(), heap.end());
    fmt::println("std::sort_heap: {}", heap);
    // 预期输出: std::sort_heap: [1, 2, 3, 4]heap = {4, 3, 2, 1};
    // 使用 std::ranges::sort_heap
    std::ranges::sort_heap(heap);
    fmt::println("std::ranges::sort_heap: {}", heap);
    // 预期输出: std::ranges::sort_heap: [1, 2, 3, 4]
    
  • is_heap, ranges::is_heap: 检查范围是否为堆.

    std::vector<int> heap = {4, 3, 2, 1};
    // 使用 std::is_heap
    bool stdIsHeap = std::is_heap(heap.begin(), heap.end());
    fmt::println("std::is_heap: {}", stdIsHeap);
    // 预期输出: std::is_heap: truestd::vector<int> notHeap = {1, 3, 2, 4};
    stdIsHeap = std::is_heap(notHeap.begin(), notHeap.end());
    fmt::println("std::is_heap (not heap): {}", stdIsHeap);
    // 预期输出: std::is_heap (not heap): falseheap = {4, 3, 2, 1};
    // 使用 std::ranges::is_heap
    bool rangesIsHeap = std::ranges::is_heap(heap);
    fmt::println("std::ranges::is_heap: {}", rangesIsHeap);
    // 预期输出: std::ranges::is_heap: truenotHeap = {1, 3, 2, 4};
    rangesIsHeap = std::ranges::is_heap(notHeap);
    fmt::println("std::ranges::is_heap (not heap): {}", rangesIsHeap);
    // 预期输出: std::ranges::is_heap (not heap): false
    
  • is_heap_until, ranges::is_heap_until: 查找范围中第一个不满足堆性质的元素.

    std::vector<int> partialHeap = {4, 3, 1, 2, 5};
    // 使用 std::is_heap_until
    auto stdHeapUntil =std::is_heap_until(partialHeap.begin(), partialHeap.end());
    fmt::println("std::is_heap_until: {}",std::distance(partialHeap.begin(), stdHeapUntil));
    // 预期输出: std::is_heap_until: 3partialHeap = {4, 3, 1, 2, 5};
    // 使用 std::ranges::is_heap_until
    auto rangesHeapUntil = std::ranges::is_heap_until(partialHeap);
    fmt::println("std::ranges::is_heap_until: {}",std::distance(partialHeap.begin(), rangesHeapUntil));
    // 预期输出: std::ranges::is_heap_until: 3
    

最大最小值

  • max, ranges::max: 返回两个值中的最大值.

    int a = 5, b = 10;
    // 使用 std::max
    fmt::println("std::max: {}", std::max(a, b));
    // 预期输出: std::max: 10// 使用 std::ranges::max
    fmt::println("std::ranges::max: {}", std::ranges::max(a, b));
    // 预期输出: std::ranges::max: 10
    
  • max_element, ranges::max_element: 查找范围内的最大元素.

    std::vector<int> numbers = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    // 使用 std::max_element
    fmt::println("std::max_element: {}",*std::max_element(numbers.begin(), numbers.end()));
    // 预期输出: std::max_element: 9// 使用 std::ranges::max_element
    fmt::println("std::ranges::max_element: {}",*std::ranges::max_element(numbers));
    // 预期输出: std::ranges::max_element: 9
    
  • min, ranges::min: 返回两个值中的最小值.

    int a = 5, b = 10;
    // 使用 std::min
    fmt::println("std::min: {}", std::min(a, b));
    // 预期输出: std::min: 5// 使用 std::ranges::min
    fmt::println("std::ranges::min: {}", std::ranges::min(a, b));
    // 预期输出: std::ranges::min: 5
    
  • min_element, ranges::min_element: 查找范围内的最小元素.

    std::vector<int> numbers = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    // 使用 std::min_element
    fmt::println("std::min_element: {}",*std::min_element(numbers.begin(), numbers.end()));
    // 预期输出: std::min_element: 1// 使用 std::ranges::min_element
    fmt::println("std::ranges::min_element: {}",*std::ranges::min_element(numbers));
    // 预期输出: std::ranges::min_element: 1
    
  • minmax, ranges::minmax: 返回两个值中的最小值和最大值.

    int a = 5, b = 10;
    // 使用 std::minmax
    auto stdMinMax = std::minmax(a, b);
    fmt::println("std::minmax: min = {}, max = {}", stdMinMax.first,stdMinMax.second);
    // 预期输出: std::minmax: min = 5, max = 10// 使用 std::ranges::minmax
    auto rangesMinMax = std::ranges::minmax(a, b);
    fmt::println("std::ranges::minmax: min = {}, max = {}", rangesMinMax.min,rangesMinMax.max);
    // 预期输出: std::ranges::minmax: min = 5, max = 10
    
  • minmax_element, ranges::minmax_element: 查找范围内的最小元素和最大元素.

    std::vector<int> numbers = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    // 使用 std::minmax_element
    auto stdMinMaxElement = std::minmax_element(numbers.begin(), numbers.end());
    fmt::println("std::minmax_element: min = {}, max = {}",*stdMinMaxElement.first, *stdMinMaxElement.second);
    // 预期输出: std::minmax_element: min = 1, max = 9// 使用 std::ranges::minmax_element
    auto rangesMinMaxElement = std::ranges::minmax_element(numbers);
    fmt::println("std::ranges::minmax_element: min = {}, max = {}",*rangesMinMaxElement.min, *rangesMinMaxElement.max);
    // 预期输出: std::ranges::minmax_element: min = 1, max = 9
    
  • clamp, ranges::clamp: 将值限制在指定范围内.

    int value = 15;
    int low = 10, high = 20;
    // 使用 std::clamp
    fmt::println("std::clamp: {}", std::clamp(value, low, high));
    // 预期输出: std::clamp: 15// 使用 std::ranges::clamp
    fmt::println("std::ranges::clamp: {}", std::ranges::clamp(value, low, high));
    // 预期输出: std::ranges::clamp: 15
    

Lexicographical comparison operations

  • lexicographical_compare, ranges::lexicographical_compare: 按字典序比较两个范围.

    std::vector<int> first = {1, 2, 3};
    std::vector<int> second = {1, 2, 4};// 使用 std::lexicographical_compare
    bool stdResult = std::lexicographical_compare(first.begin(), first.end(),second.begin(), second.end());
    fmt::println("std::lexicographical_compare: {}", stdResult);
    // 预期输出: std::lexicographical_compare: true// 使用 std::ranges::lexicographical_compare
    bool rangesResult = std::ranges::lexicographical_compare(first, second);
    fmt::println("std::ranges::lexicographical_compare: {}", rangesResult);
    // 预期输出: std::ranges::lexicographical_compare: true
    
  • lexicographical_compare_three_way: 按字典序比较两个范围(三路比较).

    std::vector<int> first = {1, 2, 3};
    std::vector<int> second = {1, 2, 4};// 使用 std::lexicographical_compare_three_way
    auto stdThreeWayResult = std::lexicographical_compare_three_way(first.begin(), first.end(), second.begin(), second.end());
    fmt::println("std::lexicographical_compare_three_way: {}",stdThreeWayResult < 0);
    // 预期输出: std::lexicographical_compare_three_way: true// 可以根据三路比较结果进行不同判断
    if (stdThreeWayResult < 0) {fmt::println("first is less than second");
    } else if (stdThreeWayResult > 0) {fmt::println("first is greater than second");
    } else {fmt::println("first is equal to second");
    }
    

排列

  • next_permutation, ranges::next_permutation: 生成下一个字典序排列.

    std::vector<int> numbers = {1, 2, 3};
    // 使用 std::next_permutation
    bool stdHasNext = std::next_permutation(numbers.begin(), numbers.end());
    fmt::println("std::next_permutation: has next = {}, permutation = {}",stdHasNext, numbers);
    fmt::println("std::next_permutation: permutation = {}", numbers);
    // 预期输出: std::next_permutation: has next = true, permutation = [1, 3, 2]numbers = {1, 2, 3};
    // 使用 std::ranges::next_permutation
    auto rangesResult = std::ranges::next_permutation(numbers);
    fmt::println("std::ranges::next_permutation: has next = {}, permutation ={}",rangesResult.found, numbers);
    // 预期输出: std::ranges::next_permutation: has next = true, permutation = [1,
    // 3, 2]
    
  • prev_permutation, ranges::prev_permutation: 生成上一个字典序排列.

    std::vector<int> numbers = {3, 2, 1};
    // 使用 std::prev_permutation
    bool stdHasPrev = std::prev_permutation(numbers.begin(), numbers.end());
    fmt::println("std::prev_permutation: has prev = {}, permutation = {}",stdHasPrev, numbers);
    // 预期输出: std::prev_permutation: has prev = true, permutation = [3, 1, 2]numbers = {3, 2, 1};
    // 使用 std::ranges::prev_permutation
    auto rangesResult = std::ranges::prev_permutation(numbers);
    fmt::println("std::ranges::prev_permutation: has prev = {}, permutation = {}",rangesResult.found, numbers);
    // 预期输出: std::ranges::prev_permutation: has prev = true, permutation = [3,
    // 1, 2]
    
  • is_permutation, ranges::is_permutation: 检查两个范围是否为同一排列.

    std::vector<int> first = {1, 2, 3};
    std::vector<int> second = {3, 2, 1};
    // 使用 std::is_permutation
    bool stdIsPerm =std::is_permutation(first.begin(), first.end(), second.begin());
    fmt::println("std::is_permutation: {}", stdIsPerm);
    // 预期输出: std::is_permutation: truefirst = {1, 2, 3};
    second = {3, 2, 1};
    // 使用 std::ranges::is_permutation
    bool rangesIsPerm = std::ranges::is_permutation(first, second);
    fmt::println("std::ranges::is_permutation: {}", rangesIsPerm);
    // 预期输出: std::ranges::is_permutation: true
    

数值操作

  • iota, ranges::iota: 生成递增序列.

    std::vector<int> numbers(5);
    // 使用 std::iota
    std::iota(numbers.begin(), numbers.end(), 1);
    fmt::println("std::iota: {}", numbers);
    // 输出: std::iota: [1, 2, 3, 4, 5]numbers.resize(5);
    // 使用 std::ranges::iota
    std::ranges::iota(numbers, 1);
    fmt::println("std::ranges::iota: {}", numbers);
    // 输出: std::ranges::iota: [1, 2, 3, 4, 5]
    
  • accumulate: 计算范围内所有元素的累积和.

    std::vector<int> numbers = {1, 2, 3, 4, 5};
    // 使用 std::accumulate
    int sum = std::accumulate(numbers.begin(), numbers.end(), 0);
    fmt::println("std::accumulate: {}", sum);
    // 输出: std::accumulate: 15
    
  • inner_product: 计算两个范围的内积.

    std::vector<int> first = {1, 2, 3};
    std::vector<int> second = {4, 5, 6};
    // 使用 std::inner_product
    int product =std::inner_product(first.begin(), first.end(), second.begin(), 0);
    fmt::println("std::inner_product: {}", product);
    // 输出: std::inner_product: 32
    
  • adjacent_difference: 计算范围中相邻元素的差.

    std::vector<int> numbers = {1, 3, 6, 10, 15};
    std::vector<int> result(5);
    // 使用 std::adjacent_difference
    std::adjacent_difference(numbers.begin(), numbers.end(), result.begin());
    fmt::println("std::adjacent_difference: {}", result);
    // 输出: std::adjacent_difference: [1, 2, 3, 4, 5]
    
  • partial_sum: 计算范围的部分和.

    std::vector<int> numbers = {1, 2, 3, 4, 5};
    std::vector<int> result(5);
    // 使用 std::partial_sum
    std::partial_sum(numbers.begin(), numbers.end(), result.begin());
    fmt::println("std::partial_sum: {}", result);
    // 输出: std::partial_sum: [1, 3, 6, 10, 15]
    
  • reduce (C++17): 并行计算范围内元素的累积和.

    std::vector<int> numbers = {1, 2, 3, 4, 5};
    // 使用 std::reduce
    int sum = std::reduce(numbers.begin(), numbers.end(), 0);
    fmt::println("std::reduce: {}", sum);
    // 输出: std::reduce: 15
    
  • inclusive_scan: 计算范围的前缀和(包含当前元素).

    std::vector<int> numbers = {1, 2, 3, 4, 5};
    std::vector<int> result(5);
    // 使用 std::inclusive_scan
    std::inclusive_scan(numbers.begin(), numbers.end(), result.begin());
    fmt::println("std::inclusive_scan: {}", result);
    // 输出: std::inclusive_scan: [1, 3, 6, 10, 15]
    
  • exclusive_scan: 计算范围的前缀和(不包含当前元素).

    std::vector<int> numbers = {1, 2, 3, 4, 5};
    std::vector<int> result(5);
    // 使用 std::exclusive_scan
    std::exclusive_scan(numbers.begin(), numbers.end(), result.begin(), 0);
    fmt::println("std::exclusive_scan: {}", result);
    // 输出: std::exclusive_scan: [0, 1, 3, 6, 10]
    
  • transform_reduce: 并行计算范围内元素的累积和, 同时应用变换函数.

    std::vector<int> numbers = {1, 2, 3, 4, 5};
    auto square = [](int x) { return x * x; };
    // 使用 std::transform_reduce
    int sumOfSquares = std::transform_reduce(numbers.begin(), numbers.end(), 0,std::plus<>(), square);
    fmt::println("std::transform_reduce: {}", sumOfSquares);
    // 输出: std::transform_reduce: 55
    
  • transform_inclusive_scan: 计算范围的前缀和(包含当前元素), 同时应用变换函数.

    std::vector<int> numbers = {1, 2, 3, 4, 5};
    std::vector<int> result(5);
    auto square = [](int x) { return x * x; };
    // 使用 std::transform_inclusive_scan
    std::transform_inclusive_scan(numbers.begin(), numbers.end(), result.begin(),std::plus<>(), square);
    fmt::println("std::transform_inclusive_scan: {}", result);
    // 输出: std::transform_inclusive_scan: [1, 5, 14, 30, 55]
    
  • transform_exclusive_scan: 计算范围的前缀和(不包含当前元素), 同时应用变换函数.

    std::vector<int> numbers = {1, 2, 3, 4, 5};
    std::vector<int> result(5);
    auto square = [](int x) { return x * x; };
    // 使用 std::transform_exclusive_scan
    std::transform_exclusive_scan(numbers.begin(), numbers.end(), result.begin(),0, std::plus<>(), square);
    fmt::println("std::transform_exclusive_scan: {}", result);
    // 输出: std::transform_exclusive_scan: [0, 1, 5, 14, 30]
    

参考链接

  • Algorithms library
  • 源码链接

http://www.mrgr.cn/news/90261.html

相关文章:

  • 解释和对比“application/octet-stream“与“application/x-protobuf“
  • 前端如何判断浏览器 AdBlock/AdBlock Plus(最新版)广告屏蔽插件已开启拦截
  • 水下 SLAM 定位模组的设计与实现
  • 使用STM32F103C8T6和ESP8266链接阿里云
  • [c语言日寄]跳水比赛名次问题:从逻辑推理到编程实现
  • LLMs之DeepSeek r1:TinyZero(复现 DeepSeek R1 Zero 的核心功能)的简介、安装和使用方法、案例应用之详细攻略
  • android framework原生功能配置改动
  • React(三)
  • 分布式id探索
  • PromptSource官方文档翻译
  • 【报错信息】环境安装、python
  • 【02】RUST项目(Cargo)
  • 微信小程序分包异步化
  • 互联网大厂中面试的高频计算机网络问题及详解
  • 几种3D 旋转 的参数化形式
  • Node.js笔记入门篇
  • 使用 AlexNet 实现图片分类 | PyTorch 深度学习实战
  • Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)
  • 【RabbitMQ重试】重试三次转入死信队列
  • Pdf手册阅读(1)--数字签名篇
  • Ubuntu安装PgSQL17
  • 嵌入式音视频开发(一)ffmpeg框架及内核解析
  • 擎天柱例程35 串口绘图
  • 2025-2-10-4.4 双指针(基础题1)
  • elementplus 使用日期时间选择器,设置可选范围为前后大于2年且只能选择历史时间不能大于当前时间点
  • 【大数据安全分析】为什么要用大数据技术进行安全分析?