“Надлежащий” способ хранить двоичные данные с C++ / STL

Разница заключается в синтаксисе. Find и FindAsync позволяют создавать асинхронный запрос с одинаковой производительностью, только

FindAsync возвращает курсор, который не загружает сразу все документы и предоставляет интерфейс для получения документов по одному из курсора DB. Это полезно, если результат запроса огромен.

Find предоставляет вам более простой синтаксис с помощью метода ToListAsync, где он внутри извлекает документы из курсора и сразу возвращает все документы.

45
задан Sean Edwards 14 January 2009 в 08:58
поделиться

4 ответа

вектор символа хорош, потому что память непрерывна. Поэтому можно использовать его с большим количеством API C, такого как сокеты berkley или API файла. Можно сделать следующее, например:

  std::vector<char> vect;
  ...
  send(sock, &vect[0], vect.size());

и это будет хорошо работать.

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

оборотная сторона изменяет размеры, не ужасно эффективно (измените размеры или предварительно выделите разумно), и удаление от передней стороны массива также будет очень неэффективно. Если необходимо, скажем, вытолкать всего один или два символа за один раз от передней стороны структуры данных очень часто, копируя в двухстороннюю очередь, прежде чем эта обработка сможет быть опцией. Это стоит Вам, память копии и двухсторонней очереди не непрерывна, таким образом, Вы не можете только передать указатель на API C.

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

41
ответ дан Doug T. 23 September 2019 в 10:52
поделиться

Самая большая проблема со станд.:: строка - то, что текущий стандарт не гарантирует, что его базовая система хранения непрерывна. Однако нет никаких известных реализаций STL, где строка не непрерывна, так на практике она, вероятно, не перестанет работать. На самом деле новый C++ 0x стандарт собирается решить эту проблему путем передавания под мандат того станд.:: представьте в виде строки использует непрерывный буфер, такой как станд.:: вектор.

Другой аргумент против строки - то, что его имя предполагает, что она содержит символьную строку, не двоичный буфер, который может вызвать беспорядок тем, кто считал код.

Однако я рекомендую вектор также.

8
ответ дан 23 September 2019 в 10:52
поделиться

Я использую std::string для этого также и никогда не имел проблемы с нею.

Один "указатель", из которого я просто получил резкое напоминание в части кода вчера: при создании строки из блока двоичных данных используйте std::string(startIter, endIter) форма конструктора, не эти std::string(ptr, offset, length) форма - последний делает предположение, что указатель указывает на строку C-стиля и игнорирует что-либо после первого нулевого символа (это копирует "до" указанного length, не length символы).

6
ответ дан Head Geek 23 September 2019 в 10:52
поделиться

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

У символов есть несколько свойств, которые делают их полезными для хранения двоичных данных: стандарт запрещает любые «дополнения» для типа данных char, что важно, поскольку это означает, что вы не получите мусора в своей двоичной структуре. Гарантируется, что каждый символ будет ровно одним байтом, что делает его единственным простым старым типом данных (POD) с заданной шириной (все остальные указаны в терминах верхних и / или нижних границ).

Дискуссия о подходящем контейнере stl для хранения символов хорошо поддерживается Дугом выше. Какой из них вам нужен, полностью зависит от вашего варианта использования. Если вы просто держите блок данных, через который вы проходите итерацию, без какого-либо специального поиска, добавления / удаления или соединения, я бы предпочел вектор, который делает ваши намерения более ясными, чем std :: string, который будут принимать многие библиотеки и функции содержит строку в стиле c с нулевым символом в конце.

3
ответ дан Todd Gardner 23 September 2019 в 10:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: