用C++标准库填充索引

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

有一些数据

struct Data {
    std::size_t some_other_data = 0;
    std::size_t id = 0;
};

存储在 std::vector 中我想通过元素

id
创建元素索引并将其附加到更大的索引文件中。

如果我想用

std
算法来实现这个,我应该遵循哪种方式?

这是用“普通”C++ 编写的代码:

#include <cstddef>
#include <vector>

struct Data {
    std::size_t some_other_data = 0;
    std::size_t id = 0;
};

int main()
{
    std::vector<std::size_t> collected_indexes;

    std::vector<Data> dict = { { 2, 2 }, { 0, 0 }, { 1, 1 } };

    std::vector<std::size_t> index(dict.size());

    // The code I want to rewrite shorter with std
    for (std::size_t i = 0; i < index.size(); ++i) {
        index[dict[i].id] = i;
    }

    collected_indexes.append_range(index);
    // End of code
}

如果所提出的解决方案可以与 execution_policies 一起使用以使其并行,那就太好了。

c++ indexing std
2个回答
0
投票

如果我想用std算法来实现这个,我应该遵循哪种方式?

使用

std::ranges::transform
(自 起),您可能会这样做:

#include <ranges>  // std::ranges::transform

std::vector<std::size_t> collected_indexes;
std::vector<Data> dict = { { 2, 2 }, { 0, 0 }, { 1, 1 } };

// Use std::ranges::transform to generate index and append it to collected_indexes
std::ranges::transform(dict, std::back_inserter(collected_indexes), [](const Data& d) { return d.id; });

另请注意,

std::vector<std::size_t> index(dict.size());
在这里是多余的。您可以直接附加到
collected_indexes
,如上所示。


0
投票

不是更短,但可能更具可读性(以我不那么谦虚和极端偏见的观点):

#include <cstddef>  
#include <ranges>
#include <vector>

namespace views = std::views;

struct Data
{
    std::size_t some_other_data;
    std::size_t id;
};

int main()
{
    std::vector<Data> dict { { 2, 2 }, { 0, 0 }, { 1, 1 } };

    std::vector<std::size_t> index(dict.size());

    // The code I want to rewrite shorter with std
    for (auto&& [i, e] : views::enumerate(dict)) index[e.id] = i;
}

链接:https://godbolt.org/z/Kx1xPrh8z

注意:它需要编译器中的 支持。

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