2013-05-27 6 views
2

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

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

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

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

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

+0

memcpy может использоваться для любого целевого индекса .. но убедитесь, что вы выделили место сначала .. –

+0

memcpy будет ** не ** увеличивать итератор конца. Это просто бульдозы над местом памяти, которое вы ему даете, независимо от того, принадлежит оно вам или нет. memcpy полностью не знает о каких-либо контейнерах. –

+0

Вы хотите использовать ответ Sharptooth конкретно, а не, например, ответ sbi в вопросе, который вы связали? Ответ sbi, кажется, решает как 1), так и 2). – jogojapan

ответ

2

Регулировка ответ вы связаны между собой:

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

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

+0

Как насчет энтерианства? Это (основная) причина, по которой я указал на ответ Шарптута. – Subway

+0

И еще один вопрос: почему этот ответ использует 'reinterpret_cast' не' static_cast'? – Subway

+0

Как вы хотите, чтобы он работал? Мой ответ будет использовать «родную» консистенцию системы. Если вы хотите обратное, используйте 'std :: reverse_copy' с' std :: back_inserter', похожим на ответ @ 43l0v3k. Если вы хотите всегда использовать байтовый порядок «сети», вам понадобится условная компиляция, специализированная специализация или аналогичная (см. Ntohl() и любые связанные функции на вашем компьютере для различных целых ширины). –

2

1,2

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

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