第9.15章: 把容器范围交给算法
概述
所有 fast_io 容器都提供 begin() 与 end() 迭代器,这意味着它们可以通过 <algorithm> 和 <ranges> 与 C++ 标准库算法配合使用。
1. 在 fast_io 容器上使用 std::ranges
#include <fast_io_dsal/vector.h>
#include <algorithm>
#include <ranges>
#include <fast_io.h>
int main() {
::fast_io::vector<::std::size_t> v{5zu, 3zu, 1zu, 4zu, 2zu};
// Sort using std::ranges
::std::ranges::sort(v);
// v is now {1zu, 2zu, 3zu, 4zu, 5zu}
// Find an element
auto it = ::std::ranges::find(v, 3zu);
if (it != v.end()) {
::fast_io::io::println("Found 3 at index ",
static_cast<::std::size_t>(it - v.begin()));
}
// Count elements greater than 2
auto count = ::std::ranges::count_if(v, [](::std::size_t x) { return x > 2zu; });
::fast_io::io::println("Count > 2: ", count); // 3
// Erase-remove idiom
::fast_io::vector<::std::size_t> w{1zu, 2zu, 3zu, 2zu, 4zu, 2zu, 5zu};
auto new_end = ::std::ranges::remove(w, 2zu);
w.erase(new_end, w.end());
// w is now {1zu, 3zu, 4zu, 5zu}
}
2. 自由函数:erase() 与 erase_if()
你也可以使用为所有容器提供的自由函数 erase() 和 erase_if():
::fast_io::vector<::std::size_t> v{1zu, 2zu, 3zu, 2zu, 4zu, 2zu, 5zu};
// Remove all 2s
auto removed = erase(v, 2zu);
// v is now {1zu, 3zu, 4zu, 5zu}, removed == 3
// Remove elements matching a predicate
auto removed2 = erase_if(v, [](::std::size_t x) { return x > 3zu; });
// v is now {1zu, 3zu}, removed2 == 2
要点
- 所有
fast_io容器都能配合std::ranges::算法使用。 - 所有容器都提供自由函数
erase()和erase_if()。 std::ranges::sort、std::ranges::find、std::ranges::count_if都能直接使用。- erase-remove 惯用法可以用
std::ranges::remove加erase()实现。