簡體   English   中英

將 class 的向量拆分為 class 成員的向量

[英]Split vector of class into vector of class member

我在 C++ 中發現了一個我自己無法解決的問題,所以我想問你,是否有可能將class的向量拆分為class 成員的向量

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創建的向量 在我看來,“IDONOTKNOW”應該看起來像vector<CData.CPerson> 因此,應該有與向量中相同的數據,但沒有屬性m_Data

有什么選擇如何做到這一點?

當然我不想復制它,因為我想通過引用傳遞它。

非常感謝您的提示;-)

向量擁有它的內容,所以如果你想返回一個std::vector<CPerson>你必須復制數據,例如

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<CPerson *>

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<std::reference_wrapper<CPerson>>

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引用的開始/結束迭代器:

#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; });
}

返回的 object 具有begin()end()及其迭代器對CPerson &的取消引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM