Будет ли этот метод включать перераспределение памяти и, таким образом, влиять на его эффективность? - PullRequest
2 голосов
/ 02 марта 2020

Я обнаружил, что мы можем прочитать содержимое файла в std :: vector следующим образом:

  ifstream fin(..., ios::in);
    std::vector<char> buf(
            std::istreambuf_iterator<char>(fin), 
            std::istreambuf_iterator<char>());   

Будет ли этот метод вызывать много перераспределения памяти, как когда я вызываю buf.push_back(); для много раз? Какой самый быстрый или лучший метод для чтения файла в std::vector?

Редактировать: Кстати, я считаю, что есть метод для чтения файла в поток строки:

stringstream ss;
ifstream fin(..., ios::in);
fin >> ss.rdbuf();

Будет ли у этого метода такая же проблема перераспределения памяти?

Ответы [ 2 ]

2 голосов
/ 02 марта 2020

std::istreambuf_iterator - итератор ввода, поэтому расстояние между началом и концом заранее неизвестно. Во время конструктора будет несколько перераспределений, если файл не очень маленький. Для итератора произвольного доступа расстояние будет известно, и в этом случае конструктор может избежать дополнительных выделений памяти.

Если вы приблизительно знаете размер файла, вы можете использовать reserve() перед прочтением:

std::vector<char> buf;
buf.reserve(file_size);
buf.insert(buf.end(), std::istreambuf_iterator<char>(fin), 
        std::istreambuf_iterator<char>());   
0 голосов
/ 02 марта 2020

Вектор сохраняет данные, расположенные последовательно. Когда добавляется новый элемент, он может не иметь свободной памяти после последнего элемента, тогда ему нужно переместить все данные в место в памяти, где достаточно места для старых и новых данных.

Лучший Решение - дать буфер для вектора с помощью следующей команды: vector :: reserve (size);

Ваш код может быть:

std::vector<char> buf;
buf.reserve(10000);
buf.assign(std::istreambuf_iterator<char>(fin),
            std::istreambuf_iterator<char>());
buf.shrink_to_fit(); //free the unused memory
...