Извлечение ссылки из вектора C ++ - PullRequest
0 голосов
/ 28 апреля 2010

У меня есть vector< vector< vector< int>>>, и я бы хотел извлечь из него vector< vector< int>> для отдельной обработки.

Проблема в том, что когда я пишу:

myMatrix = myCube[anIndex];

матрица скопирована, но мне нужна только ссылка для экономии памяти. Можете ли вы помочь мне?

Большое спасибо!

Ответы [ 6 ]

2 голосов
/ 28 апреля 2010

Просто используйте

vector<vector<int> >& myMatrix = myCube[anIndex]; 
1 голос
/ 28 апреля 2010

vector::operator[] возвращает ссылку - до тех пор, пока вы сохраняете этот результат в виде ссылки вместо полноценного объекта, вам следует избегать копирования.

vector< vector<int > >& myMatrix = myCube[anIndex];
1 голос
/ 28 апреля 2010

Используйте итератор типа vector< vector< int> >::const_iterator. Надеюсь, это поможет.

0 голосов
/ 28 апреля 2010

Будьте осторожны с отзывами участников! Если указанный объект очищается до того, как будет создан экземпляр MyClass, у вас будет недопустимая ссылка. Часто (но не всегда), если вы обнаружите, что вам нужно использовать ссылку на член, это является ранним предупреждением о том, что ваш дизайн может быть улучшен. Я редко использую ссылки на члены для чего-либо другого, кроме как в качестве дескриптора для владельца объекта, где я могу быть абсолютно уверен, что упомянутый объект переживет ссылку.

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

// To start, define your class to allow you to build up the data
class MyMatrix
{
public:
  MyMatrix ()
    { }

  void  setData (int x, int y, int data)
    { this->myData [x][y] = data; }
  int   getData (int x, int y)
    { return this->myData [x][y]; }

private:
  vector<vector<int> > myData; 
} 

// Then, create a vector of 6 (or however many you need) matrices
int numberOfMatrices = 6;
vector<MyMatrix> myCube (numberOfMatrices);

// Then, fill in the vector
for (int matrixIndex = 0; matrixIndex < numberOfMatrices; matrixIndex++)
  {
  // Fill in the data for this matrix
  MyMatrix &currentMatrix = myCube [matrixIndex];

  currentMatrix.setData (0 /* x */, 0 /* y */, 0 /* data */);
  // ... rest of data
  }

Тогда у вас есть все данные, уже находящиеся в ваших объектах, готовые для обработки по мере необходимости. Кроме того, каждый объект владеет своими данными, поэтому, пока объект находится рядом, его данные будут действительными. Лучше всего то, что использование объектов с полезными именованными функциями-членами сделает ваш код намного более самодокументированным, чем тонны вложенных контейнеров.

0 голосов
/ 28 апреля 2010

Вместо использования оператора [] используйте функции, возвращающие итераторы в качестве аванса, и объявите матрицу следующим образом

vector< vector< int> >::iterator myMatrixPtr;

myMatrixPtr = std::advance(myCube, anIndex);

Теперь вы можете работать с myMatrixPtr, как если бы это был указатель. Если вы предпочитаете ссылку, вы можете инициализировать ее после этой инициализации

vector< vector<int > >& myMatrix = *myMatrixPtr;
0 голосов
/ 28 апреля 2010

Если myMatrix является членом класса и вы хотите иметь возможность инициализировать его вне конструктора, ваш единственный выбор - использовать указатель:

class Whatever
{
  //...
  vector<vector<int>>* myMatrix;
  //...
}

  myMatrix = &myCube[anIndex]

РЕДАКТИРОВАТЬ: Если вы можете жить с инициализацией myMatrix в конструкторе, вы можете использовать ссылку:

class Whatever
{
  //...
  vector<vector<int> >& myMatrix;
  //...
}

Whatever::Whatever(vector<vector<vector<int> > >& myCube), int anIndex)
: myMatrix(myCube[anIndex])
{
  //...
}

Кстати, вы должны отделить > в своем коде, если только вы не используете компилятор, совместимый с C ++ 0x; в противном случае компилятор проанализирует >> как operator>> и выдаст ошибку.

...