Динамические непрямоугольные двумерные векторы в C ++ - PullRequest
0 голосов
/ 10 мая 2011

Я видел много дискуссий о прямоугольных 2-D массивах в C ++, но не столько о том, с чем я работаю. Мне нужно хранить одинаковую информацию о фиксированном количестве вещей, поэтому я создал структуру и думаю, что хочу иметь вектор их векторов, поэтому я сделал следующие определения:

typedef struct sInfo {
  int  Length;
  int  RemainingReadLength;
  int  RemainingWriteLength;
  bool FillFlag;
  int  Offset;
}; 

class InfoClass {
protected:
<vector<vector<sInfo> > vvInfo;
uint32                  Index1;
uint32                  Index2;
sInfo                   Info;

public:
InfoClass () : vvInfo(NUM_INFO) {}

void AddInfo() {
    vvInfo[Index1].push_back(Info);
}

uint getLength ()  {
  return (vvInfo[Index1][Index2].Length;
}
}

Я имею в виду фиксированное количество строк, каждая из которых может расширяться или сжиматься независимо. Насколько я могу судить, ctor создает пустые векторы NUM_ID, и, по крайней мере, сначала getLength работает. Однако в AddInfo, похоже, есть проблемы с выделением.

Итак, во-первых, это лучший способ решения проблемы? Если да, то правильно ли я справляюсь с этими динамически распределенными, рваными векторами?

Спасибо

Ответы [ 2 ]

0 голосов
/ 10 мая 2011

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

Тем не менее:

  • C ++ 0x больше не имеет этой проблемы, потому что он использует конструкторы перемещения при перераспределении и (при условии, что автор стандартной библиотеки правильно реализовал эти конструкторы перемещения) они продолжают использовать старую память для нового объекта.
  • Стратегия распределения разработана таким образом, что каждый элемент копируется в среднем только несколько раз (1-2 для фактора перераспределения 2, 3-4 для фактора перераспределения 1,5; зависит от конкретной реализации).
  • Реализация с использованием копирования при записи не будет иметь этой проблемы, но IIRC ни одна стандартная библиотека не использует ее для векторов (в то время как некоторые делают для строк)
  • Если вы заранее знаете размер внешнего вектора и .reserve() его, перераспределение не произойдет, так что беспокоиться не о чем.
0 голосов
/ 10 мая 2011

Ваш подход не выглядит для меня слишком плохо.Однако, если у вас фиксированное количество строк и вы имеете доступ к C ++ 0x / TR1, вы можете использовать std::(tr1::)array<T,N>.
Тогда, о каких проблемах выделения вы говорите?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...