Скопируйте раздел массива в std :: vector в C ++ - PullRequest
0 голосов
/ 08 января 2019

Здравствуйте, мне интересно, можно ли скопировать часть массива при инициализации вектора.

Например, я пытался

UINT16 myarray[] = { 0,1,2,3,4,5,6, ..., n };
std::vector<UINT16> myvect(myarray[3], myarray[3] + 16);

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

Ответы [ 3 ]

0 голосов
/ 08 января 2019
UINT16 myarray[] = { 0,1,2,3,4,5,6, ..., n };
std::vector<UINT16> myvect(myarray[3], myarray[3] + 16);

При этом используются myarray[3], равные 3 и myarray[3] + 16, равные 19, в качестве аргументов для конструктора myvect. Что, в свою очередь, устанавливает myvect для содержания 3 элементов, все со значением 19.

Если вам нужна копия 16 элементов, начиная с индекса 3, вы можете сделать это следующим образом:

std::vector<UINT16> myvect(&myarray[3], &myarray[3 + 16]);
0 голосов
/ 09 января 2019

Вот другой (более подробный) способ:

uint16_t       myarray[]  = { 0, 1, 2, 3, 4, 5, 6, ..., n };
constexpr auto arr_size   = sizeof(myarray) / sizeof(myarray[0]);
constexpr auto copy_start = std::min< size_t >(3, arr_size);
constexpr auto copy_count = 19;
constexpr auto copy_end   = std::min< size_t >(copy_start + copy_count, arr_size);

vector< uint16_t > myvect(std::next(myarray, copy_start), std::next(myarray, copy_end));

Вместо UINT16 вы можете использовать uint16_t тип от C ++ 11 и выше: Фиксированные целые числа ширины (если ваш компилятор поддерживает это)

Если ваши значения доступны во время компиляции, то вы можете использовать константы времени компиляции (constexpr) для вычисления вспомогательных переменных. В противном случае следует использовать const.

Стандартные алгоритмы можно использовать и для массивов, поэтому смещение std::next можно использовать для получения n-го элемента массива.

0 голосов
/ 08 января 2019

Способ состоит в том, чтобы передавать итераторы, а не значения

std::vector<UINT16> myvect(myarray + 3, myarray + 3 + 16);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...