如何使用 std::views C++20 功能对向量进行排序?
How to sort a vector using std::views C++20 feature?
我想以排序的方式遍历向量而不修改基础向量。
std::views
and/orstd::range
可以用于此目的吗?
我已经使用 views
成功实现了过滤,但我不知道是否可以使用谓词进行排序。
你可以在这里找到一个例子来完成:https://godbolt.org/z/cKer8frvq
#include <iostream>
#include <ranges>
#include <vector>
#include <chrono>
struct Data{
int a;
};
int main() {
std::vector<Data> vec = {{1}, {2}, {3}, {10}, {5}, {6}};
auto sortedView = // <= can we use std::views here ?
for (const auto &sortedData: sortedView) std::cout << std::to_string(sortedData.a) << std::endl; // 1 2 3 5 6 10
for (const auto &data: vec) std::cout << std::to_string(data.a) << std::endl; // 1 2 3 10 5 6
}
您必须修改某些东西才能使用std::ranges::sort
(或std::sort
),但这不一定是您的实际数据。
#include <iostream>
#include <ranges>
#include <numeric>
#include <algorithm>
#include <vector>
#include <chrono>
struct Data{
int a;
friend auto operator<=> (const Data &, const Data &) = default;
};
int main() {
std::vector<Data> vec = {{1}, {2}, {3}, {10}, {5}, {6}};
std::vector<std::size_t> indexes(vec.size());
std::iota(indexes.begin(), indexes.end(), std::size_t{ 0 }); // 0z in C++23
auto proj = [&vec](std::size_t i) -> Data & { return vec[i]; };
std::ranges::sort(indexes, std::less<>{}, proj);
auto sortedView = std::ranges::views::transform(indexes, proj);
for (const auto &sortedData: sortedView) std::cout << sortedData.a << std::endl; // 1 2 3 5 6 10
for (const auto &data: vec) std::cout << data.a << std::endl; // 1 2 3 10 5 6
}
我想以排序的方式遍历向量而不修改基础向量。
std::views
and/orstd::range
可以用于此目的吗?
我已经使用 views
成功实现了过滤,但我不知道是否可以使用谓词进行排序。
你可以在这里找到一个例子来完成:https://godbolt.org/z/cKer8frvq
#include <iostream>
#include <ranges>
#include <vector>
#include <chrono>
struct Data{
int a;
};
int main() {
std::vector<Data> vec = {{1}, {2}, {3}, {10}, {5}, {6}};
auto sortedView = // <= can we use std::views here ?
for (const auto &sortedData: sortedView) std::cout << std::to_string(sortedData.a) << std::endl; // 1 2 3 5 6 10
for (const auto &data: vec) std::cout << std::to_string(data.a) << std::endl; // 1 2 3 10 5 6
}
您必须修改某些东西才能使用std::ranges::sort
(或std::sort
),但这不一定是您的实际数据。
#include <iostream>
#include <ranges>
#include <numeric>
#include <algorithm>
#include <vector>
#include <chrono>
struct Data{
int a;
friend auto operator<=> (const Data &, const Data &) = default;
};
int main() {
std::vector<Data> vec = {{1}, {2}, {3}, {10}, {5}, {6}};
std::vector<std::size_t> indexes(vec.size());
std::iota(indexes.begin(), indexes.end(), std::size_t{ 0 }); // 0z in C++23
auto proj = [&vec](std::size_t i) -> Data & { return vec[i]; };
std::ranges::sort(indexes, std::less<>{}, proj);
auto sortedView = std::ranges::views::transform(indexes, proj);
for (const auto &sortedData: sortedView) std::cout << sortedData.a << std::endl; // 1 2 3 5 6 10
for (const auto &data: vec) std::cout << data.a << std::endl; // 1 2 3 10 5 6
}