C++: добавление POD в следующее место в std::vector‹char›

Возьмем в качестве примера беззнаковое целое число. Итак, я хочу добавить целое число без знака к std::vector<char>, чтобы следующие четыре байта вектора были заполнены четырьмя байтами uint.

Теперь я хотел бы сделать это, используя ответ Sharptooth здесь, но у меня есть два вопроса:

  1. Как я могу использовать этот метод для вставки uint, начиная с первого свободного места вектора, куда указывает итератор end.
  2. Интересно, увеличивается ли итератор end при копировании в вектор с использованием memcpy, который не является векторной функцией.

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

Вопрос относится и к другим POD.


person Subway    schedule 27.05.2013    source источник
comment
memcpy можно использовать для любого целевого индекса.. но сначала убедитесь, что вы выделили место..   -  person Karoly Horvath    schedule 27.05.2013
comment
memcpy не увеличивает конечный итератор. Он просто стирает место в памяти, которое вы ему даете, независимо от того, принадлежит оно вам или нет. memcpy совершенно не знает ни о каких контейнерах.   -  person Arne Mertz    schedule 27.05.2013
comment
Вы хотите использовать именно ответ острозуба, а не, например, ответ sbi в вопросе, который вы связали? ответ sbi, кажется, решает как 1), так и 2).   -  person jogojapan    schedule 27.05.2013
comment
@jogojapan, разве ответ sbi не менее эффективен?   -  person Subway    schedule 27.05.2013
comment
@Subway Он может работать медленнее, чем memcpy, верно. Что ж, в этом случае, я думаю, вам придется использовать функцию resize вектора, чтобы убедиться, что он достаточно велик, прежде чем применять memcpy.   -  person jogojapan    schedule 27.05.2013
comment
@jogojapan, спасибо за ответ. У меня есть еще одна немилость к ответу sbi, поскольку он игнорирует порядок байтов.   -  person Subway    schedule 27.05.2013
comment
Endianness - одна и та же проблема для обоих методов. Они оба будут копировать байты в том порядке, в котором они хранятся в памяти. Следовательно, если вы используете vector<char> для отправки байтов в виде последовательности по сети, получатель может быть не в состоянии повторно преобразовать их обратно в целые числа (или другие POD). Но если вы не собираетесь отправлять поток байтов на другой компьютер (или, если на то пошло, хранить его на диске и загружать на другую платформу), это не будет проблемой.   -  person jogojapan    schedule 27.05.2013


Ответы (2)


Корректировка ответа, который вы связали:

myVector.insert(myVector.end(), begin_binary(num), end_binary(num));

Где функции начала и конца просто приводят значение, которое вы хотите вставить. Такой способ увеличивает размер вектора (и его емкость, если необходимо).

person John Zwinck    schedule 27.05.2013
comment
Что насчет эндианства? Это (основная) причина, по которой я указал на ответ Sharptooth. - person Subway; 27.05.2013
comment
И еще вопрос, почему в этом ответе используется reinterpret_cast, а не static_cast? - person Subway; 27.05.2013
comment
Как вы хотите, чтобы это работало? В моем ответе будет использоваться исходный порядок байтов системы. Если вы хотите наоборот, используйте std::reverse_copy с std::back_inserter аналогично ответу @ 43l0v3k. Если вы хотите всегда использовать сетевой порядок байтов, вам потребуется условная компиляция, специализация шаблона или что-то подобное (см. ntohl() и любые другие связанные функции, существующие на вашем компьютере для различных целочисленных значений ширины). - person John Zwinck; 27.05.2013
comment
Вы не можете использовать static_cast для преобразования между несвязанными типами, такими как int и char, поэтому здесь используется reinterpret_cast. - person John Zwinck; 27.05.2013
comment
@Subway: чтобы справиться с порядком байтов, люди обычно вставляют известное 16-битное магическое число в начале сообщения, что-то вроде 0xAAFF. Затем, если другая сторона прочитает его как 0xFFAA, она будет знать, что с этого момента ей нужно поменять местами байты. Этот тест порядка следования байтов необходимо выполнить только один раз между двумя конечными точками. - person AlexK; 27.05.2013
comment
@AlexK: Я думаю, что даже более обычным является просто решить, какой порядок следования байтов использовать (часто сетевой порядок байтов, но также может быть порядок байтов x86, потому что это самая популярная система). Форматы файлов со встроенным кодированием в режиме endian, по-видимому, больше используются для встроенных устройств, таких как цифровые камеры, или там, где наиболее важна скорость мультиплатформенного кодирования. - person John Zwinck; 28.05.2013

1,2

std::copy(begin_binary(num), end_binary(num), std::back_inserter(my_vector));

STL автоматически управляет размером вектора при вставке новых элементов.

person 43l0v3k    schedule 27.05.2013