如何使用 std::views C++20 功能对向量进行排序?

问题描述 投票:0回答:2

我想以排序的方式循环遍历向量而不修改底层向量

std::views
和/或
std::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
}
c++ stl c++20 std-ranges
2个回答
8
投票

您必须修改 something 才能使用

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
}

0
投票

您可以使用管道来

ranges::to<set>()

#include <iostream>
#include <ranges>
#include <vector>
#include <set>
using namespace std;

struct Data{
    int a;
    friend auto operator<=> (const Data &, const Data &) = default;
};

int main() {

    vector<Data> vec = {{1}, {2}, {3}, {10}, {5}, {6}};
  
    auto sortedView = vec | ranges::to<set>() ;// <= yes, we can use std::views here !
                           
    for (const auto &sortedData: sortedView) cout << to_string(sortedData.a) << ' '; // 1 2 3 5 6 10

    cout << endl;

    for (const auto &data: vec) cout << to_string(data.a) << ' '; // 1 2 3 10 5 6
}

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.