【问题标题】:Split vector of class into vector of class member将类的向量拆分为类成员的向量
【发布时间】:2021-06-19 06:24:19
【问题描述】:

我在 C++ 中发现了一个我自己无法解决的问题,所以我想问你, 如果有可能将 classvector 拆分为 class membervector。

class CPerson
{
 public:
    string m_Name;
    string m_Surname;
}
    
class CPersonList
{
 public:
    CPersonList ( const vector<CPerson> & ref )
    {
        m_List = ref;
    }
 private:
    vector<CPerson> m_List;
}

class CAllPersonsData
{
 public:
    CPersonList "MYPROBLEM" ( ) { CPersonList listAlfa ("IDONOTKNOW"); return listAlfa; }
 private:
    class CData
    {
     public:
        CPerson m_Person;
        string m_Data;
    }

    vector<CData> m_Alldata;

“MYPROBLEM”是一个应该创建并返回 CPersonList listAlfa 的方法。

listAlfa 应该由构造函数创建,我想传递从 vector 创建的 vector。在我看来,“IDONOTKNOW”应该看起来像 vector。因此,应该有与 vector 中相同的数据,但没有属性 m_Data

有什么办法可以做到吗?

我当然不想复制它,因为我想通过引用传递它。

非常感谢您的提示 ;-)

【问题讨论】:

  • 您需要std::vector 还是可以迭代的类似向量的东西?
  • 除非您复制 CPerson,否则您不能拥有 CPerson 的向量。指针向量可以吗?

标签: c++ class vector


【解决方案1】:

一个向量拥有它的内容,所以如果你想返回一个std::vector&lt;CPerson&gt;,你必须复制数据,例如

std::vector<CPerson> people;
people.reserve(m_Alldata.size());
std::transform(m_Alldata.begin(), m_Alldata.end(), std::back_inserter(people), 
               [](CData const & data) { return data.m_person; });
return people;

如果你想返回一个“引用”向量到m_Alldata 中的实例,你可以返回一个std::vector&lt;CPerson *&gt;

std::vector<CPerson *> people;
people.reserve(m_Alldata.size());
std::transform(m_Alldata.begin(), m_Alldata.end(), std::back_inserter(people), 
               [](CData const & data) { return &data.m_person; });
return people;

std::vector&lt;std::reference_wrapper&lt;CPerson&gt;&gt;:

std::vector<std::refernce_wrapper<CPerson>> people;
people.reserve(m_Alldata.size());
std::transform(m_Alldata.begin(), m_Alldata.end(), std::back_inserter(people), 
               [](CData const & data) { return std::ref(data.m_person); });
return people;

作为std::vector 的替代方案,您可以返回一对取消引用CPerson-reference 的开始/结束迭代器:

#include <boost/compute/iterator/transform_iterator.hpp>

using boost::compute::make_transform_iterator;

auto people_begin()
{
  return make_transform_iterator(m_Alldata.begin(), [](CData const & data) { return data.m_person; });
}

auto people_end()
{
  return make_transform_iterator(m_Alldata.end(), [](CData const & data) { return data.m_person; });
}

如果您可以使用范围库,则可以返回数据的 transform_view:

#include <ranges>

auto people()
{
  return std::ranges::transform_view(m_Alldata, [](CData & data) { return data.m_person; });
}

返回的对象具有begin()end() 及其迭代器对CPerson &amp; 的取消引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多