Доступ к членам в векторе объектов в качестве векторов - PullRequest
2 голосов
/ 23 апреля 2011

У меня есть класс 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()

, который возвращает вектор, который содержит каждое значение int Small :: a в m_smallVec. Единственный способ сделать это - перебрать m_smallVec и скопировать в вектор типа int. Есть ли способ сделать это без копирования?

Ответы [ 2 ]

2 голосов
/ 23 апреля 2011

Если это то, как вы ожидаете получить доступ к данным, а производительность важна, рассматривали ли вы возможность использования параллельных векторов?Вместо

  std::vector<Small>

В «Большом» вы фактически поддерживаете 3 вектора

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

Все элементы в 0 соответствуют 0-му «Маленькому», и вы можете легко отделить всеThe as from bs.

Это очень раздражающая бухгалтерия, которую вы должны быть уверены в том, что все правильно и хорошо инкапсулированы.Это не более элегантное решение, мне обычно не нравятся такие вещи, и я, вероятно, задам вопрос в обзоре кода, но оно, вероятно, даст вам наилучшую производительность для описанных вами операций.

0 голосов
/ 23 апреля 2011

нет способа сделать это без разделения малых компонентов на разные векторы, так как вектор просто работает как массив, что означает, что когда вы создаете вектор маленьких, между маленькими переменными :: a будет 2 пробела, тогда как Вы, что вернуть, это просто массив целых. и, кстати, гораздо эффективнее, если вы прекратите работать как vector <int> & getSmall(), так как если вы не вернете ссылку, это приведет к копированию m_smallVec и возврату его в результате, что также делает невозможным изменение любого значения в m_smallVec.

...