Как скопировать диапазон данных из массива char в вектор? - PullRequest
9 голосов
/ 21 января 2011

Я прочитал содержимое файла в массив символов, а затем прочитал некоторые данные из него в вектор.Как я могу скопировать диапазон массива char в вектор?массив vector и char одного и того же типа (unsigned char).

Текущий код выглядит примерно так:

int p = 0;

for(...){
    short len = (arr[p+1] << 8) | arr[p+0];
    p+=2;
    ...
    for(...len...){
        vec.push_back(arr[p]);
        p++;
    }
}

Я бы хотел улучшить это, сбросив цикл с помощью push_backКак?

1 Ответ

20 голосов
/ 21 января 2011

Добавление чего-либо к вектору можно сделать с помощью функции-члена insert():

vec.insert(vec.end(), arr, arr+len);

Конечно, есть также assign(), который, вероятно, ближе к тому, что вы хотите сделать:

vec.assign(arr, arr+len);

Однако, читая ваш вопрос, я удивлялся, почему вы сначала читаете в массив C, чтобы просто скопировать его содержимое в вектор, когда вы можете сразу прочитать в вектор. std::vector<> требуется для хранения своих данных в одном непрерывном блоке памяти, и вы можете получить доступ к этому блоку, взяв адрес его первого элемента. Просто убедитесь, что у вас достаточно места в векторе:

std::size_t my_read(char* buffer, std::size_t buffer_size);

vec.resize( appropriate_length );
vec.resize( my_read_func(&vec[0], vec.size()) );

Вместо &vec[0] вы также можете получить адрес первого элемента по &*vec.begin(). Тем не менее, обратите внимание, что при любом из этих методов вы абсолютно должны убедиться, что есть хотя бы один элемент в векторе . Ни один из этих двух методов не требуется для его проверки (хотя ваша реализация может сделать это для отладочных сборок), и оба будут вызывать страшное неопределенное поведение , если вы потерпите неудачу на этом.

...