【问题标题】:Create subset of class object vector as vector with pointers using predicate?使用谓词将类对象向量的子集创建为带有指针的向量?
【发布时间】:2021-11-30 18:32:26
【问题描述】:

是否有一种标准算法可以用来通过指向这些结构的指针向量对结构向量进行子集化?

例如

typedef struct {
    int a;
    char b;
} some_struct_t;

int main()
{
    std::vector<some_struct_t> v = { {10, '1'}, { 5, '2'} };
    std::vector<some_struct_t*> v2;

    std::some_subset_command<some_struct_t, some_struct_t*>(begin(v), end(v), std::back_inserter(v2), [](const somestruct&) { if (somestruct.a == 5) { return &somestruct; }});
}

some_subset_command() 应该使用 back_inserter 和 lambda 谓词的输出构造新向量。

我怎样才能以最具声明性的方式做到这一点?

【问题讨论】:

标签: c++ vector subset


【解决方案1】:

如果您不介意将std::vector&lt;some_struct_t*&gt; v2 更改为std::vector&lt;std::reference_wrapper&lt;some_struct_t&gt;&gt; v2(包括&lt;functional&gt;),您可以使用std::copy_if

#include <vector>
#include <algorithm>
#include <functional>

typedef struct {
    int a;
    char b;
} some_struct_t;

int main()
{
    std::vector<some_struct_t> v = { {10, '1'}, { 5, '2'} };
    std::vector<std::reference_wrapper<some_struct_t>> v2;
    std::copy_if(begin(v), end(v), std::back_inserter(v2), [](const auto &s) {
        return s.a == 5;
    });
}

有关std::reference_wrapper 的更多信息,请访问cppreference

【讨论】:

  • 谢谢你,这很酷。我不知道参考包装器!然后我可以在引用包装对象上使用成员访问运算符 (.) 吗?
  • @glades 因为它是一个包装器,您必须使用 get() 来获取引用的对象。 (例如v2[0].get().a = 1;。我将编辑我的帖子以添加指向某些文档的链接。
【解决方案2】:

如果您的编译器支持 C++20,那么您可以使用范围适配器:

#include <ranges>
#include <vector>

typedef struct {
    int a;
    char b;
} some_struct_t;

int main()
{
  std::vector<some_struct_t> v = { {10, '1'}, { 5, '2'} };
  auto r = v | std::views::filter([](auto& somestruct) { return somestruct.a == 5; })
             | std::views::transform([](auto& somestruct) { return &somestruct; });       
  std::vector<some_struct_t*> v2(r.begin(), r.end());
}

Demo.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-01
    • 2020-06-27
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    相关资源
    最近更新 更多