c++ 如何使用标准算法将A的向量复制到A的向量指针?

xriantvc  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(223)

我有一个std::vector<Edge> edges,我想使用std库将此数组中的一些项复制到std::vector<Edge*> outputs中。
我知道std::copy_if可以用来将一个指针向量复制到一个指针向量:

std::vector<Edge*> edges;
//setup edges

std::vector<Edge*> outputs;

std::copy_if(edges.cbegin(), edges.cend(), std::back_insert_iterator<decltype(outputs)>(outputs), [](auto edge) {
   return true; //here should be some condition
});

但这样做是不可能:

std::vector<Edge> edges;
//setup edges

std::vector<Edge*> outputs;

std::copy_if(edges.cbegin(), edges.cend(), std::back_insert_iterator<decltype(outputs)>(outputs), [](auto edge) {
   return true; //here should be some condition
});

我明白为什么不可能。
我的问题是:有什么算法能让我这么做吗?

bvk5enib

bvk5enib1#

您可以使用Eric Niebler的range-v3库:

  • 得到输入向量,
  • 过滤掉其中一些元素,
  • 将剩余部分转换为指向它们的指针,以及
  • 将视图转换为指针向量。

Demo(https://godbolt.org/z/5Efh8Eh7j)

#include <iostream>
#include <range/v3/all.hpp>
#include <vector>

struct Edge {
    int value;
};

int main() {
    std::vector<Edge> edges{ {-10}, {-5}, {2}, {4} };
    auto outputs = edges
        | ranges::views::filter([](auto& e){ return e.value > 0; })
        | ranges::views::transform([](auto& e) { return &e; })
        | ranges::to<std::vector<Edge*>>();
    for (const auto o : outputs) {
        std::cout << o->value << " ";
    }
}

// Outputs: 2 4

你不需要创建一个输出向量,你可以通过使用C20范围(std::ranges::to也将在C23的某个时候可用)。
Demo(https://godbolt.org/z/GKjjob5bK)

#include <iostream>
#include <ranges>
#include <vector>

struct Edge {
    int value;
};

int main() {
    std::vector<Edge> edges{ {-10}, {-5}, {2}, {4} };
    auto&& outputs{ edges
        | std::views::filter([](auto& e){ return e.value > 0; }) };
    for (auto&& o : outputs) {
        std::cout << o.value << " ";
    }
}

相关问题