Существуют ли контейнеры STL, которые хорошо подходят для использования в качестве больших двоичных объектов для программного обеспечения баз данных? Я бы подумал vector<char>
, но есть ли что-то лучше? Может std::string
? Или какой-то не-STL-контейнер?
представление больших двоичных объектов в C++
Ответы (3)
Базы данных типа BLOB
позволяют хранить двоичные данные, поэтому вам нужен упорядоченный набор байтов. Самым простым выбором будет vector<>
, и вы можете выбрать unsigned char
для представления байта на большинстве платформ.
Мы использовали stream
s в одном из наших проектов для представления значений BLOB/CLOB, хранящихся в базе данных. Я думаю, что в большинстве случаев это лучший подход, поскольку BLOB/CLOB могут быть очень большими, чтобы поместиться в памяти по определению.
Напишите свою собственную реализацию stream
и используйте ее так же, как любую другую stream
.
В настоящее время я использую std::string
для хранения больших двоичных объектов, так как использую библиотеку Google Protocol Buffers для сериализация объектов, и это то, что они используют (например, MessageLite::SerializeToString). Это хорошо работает для моих целей, так как вставить результирующую строку в виде большого двоичного объекта в базу данных SQLite очень просто:
sqlite3_bind_blob(_insert_statement, 3, data.c_str(), data.size(), SQLITE_STATIC);
(data
— это std::string
, связанный в качестве третьего аргумента с _insert_statement
.)
person.SerializeToOstream(&output)
я использую person.SerializeAsString()
, а затем использую результат как большой двоичный объект SQLite. Также есть SerializeToString(std::string*)
, если вы действительно хотите избежать копирования.
- person Ian Mackenzie; 15.06.2012
std::string
— плохая идея. В том же смысле векторchar
s (которые являются текстовыми символами) плохая идея по сравнению с векторомunsigned char
s. - person Christian Rau   schedule 20.05.2012char
не является текстовым символом.string
неплохая идея. - person Kerrek SB   schedule 20.05.2012char
— это наименьшая адресуемая единица данных и основная единица ввода-вывода. Таким образом, это идеальный тип для представления произвольных данных. Единственное, что не так сchar
, это его собственное имя. - person Kerrek SB   schedule 20.05.2012char
иunsigned char
, когда они не используются для чисел? - person Baruch   schedule 20.05.2012char
это символ, может быть просто что-то субъективное без причины. - person Christian Rau   schedule 20.05.2012signed char
иunsigned char
являются арифметическими целочисленными типами, такими какint
иunsigned int
. С другой стороны,char
явно предназначен для того, чтобы быть типом ввода-вывода, который представляет некую непрозрачную, специфичную для системы фундаментальную единицу данных на вашей платформе. Я бы использовал их в этом духе. - person Kerrek SB   schedule 20.05.2012char
лучше всего использовать для двоичных данных (с чем вы, кажется, правы),std::string
определенно нет, поскольку концептуально это текстовая строка. Вы не хотите использовать какие-либо сравнения и преобразования на основе локали для двоичных данных, не говоря уже о завершении NUL. - person Christian Rau   schedule 20.05.2012