访问作为向量的对象向量中的成员

Accessing members in a vector of objects as vectors

本文关键字:向量 成员 对象 访问      更新时间:2023-10-16

我有一个c++类,它作为对象向量包含在另一个类中。

class Small
{
public:
   int a;
   int b;    
   int c;
};
class Big 
{
public:
   vector< Small > getSmallVec() const { return m_smallVec;}
private:
   vector< Small > m_smallVec;    
};

我希望能够访问Small类的成员作为一个向量本身。换句话说,我希望在Big中有一个函数,比如

vector<int> getSmallVec_a()

返回一个包含m_smallVec中int Small::a的每个值的向量。我能想到的唯一方法是迭代m_smallVec并复制到int型向量。有没有一种不需要复制的方法?

如果这是您期望访问数据的方式,并且性能很重要,您是否考虑过使用并行向量?而不是

  std::vector<Small>

在"Big"中你实际上维持了3个向量

  std::vector<int> aVec;
  std::vector<int> bVec;
  std::vector<int> cVec;

0处的所有元素对应第0个"Small",你可以很容易地从b中分离出所有的as。

这带来了许多烦人的簿记,您必须确保正确并封装良好。这不是一个更优雅的解决方案,我通常不喜欢这种事情,可能会在代码审查中提出质疑,但它可能会为您描述的操作提供最佳性能。

如果不将不同矢量中的小组件分开,则无法做到这一点,因为矢量只是作为数组工作,这意味着当您创建一个较小的矢量时,在small::a变量之间将有2块空间,而您要返回的只是一个整数数组。顺便说一下,如果你指定你的函数为vector <int> & getSmall(),它会更有效,因为如果你不返回引用,它会导致复制m_smallVec并返回它作为结果,它也使得不可能改变m_smallVec中的任何值。