Каков наиболее эффективный способ манипулирования двумерным динамическим массивом std :: strings в памяти? - PullRequest
5 голосов
/ 03 августа 2011

Я сейчас использую

std::vector<std::vector<std::string> > MyStringArray

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

Ответы [ 3 ]

3 голосов
/ 03 августа 2011

Вот простой динамический двумерный массив с настраиваемым номером столбца во время выполнения:

class TwoDArray
{
  size_t NCols;
  std::vector<std::string> data;

public:
  explicit TwoDArray(size_t n) : NCols(n) { }

  std::string & operator()(size_t i, size_t j) { return data[i * NCols + j]; }
  const std::string & operator()(size_t i, size_t j) const { return data[i * NCols + j]; }

  void set_number_of_rows(size_t r) { data.resize(NCols * r); }

  void add_row(const std::vector<std::string> & row)
  {
    assert(row.size() == NCols);
    data.insert(data.end(), row.begin(), row.end());
  }
};

Использование:

TwoDArray arr(5); // five columns per row
arr.set_number_of_rows(20);
arr(0, 3) = "hello";
arr(17,2) = "world";

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

Ключевой особенностью является оператор двумерного доступа через (i,j), который заменяет вложенные векторы '[i][j].

1 голос
/ 03 августа 2011

Мне кажется, это разумный дизайн, учитывая ваши заявленные цели дизайна.Обратите внимание, что вам следует избегать операций, которые изменяют размер внешнего вектора;это может привести к глубокой копии всех данных в общей структуре (это может быть несколько смягчено реализацией C ++ 0x STL).

0 голосов
/ 03 августа 2011

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

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

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