Вы можете прочитать весь файл в память.Это может быть сделано с потоками C ++, или вы можете получить еще большую производительность, используя API-интерфейсы для конкретной платформы, такие как файлы с отображением в памяти или их собственные API для чтения файлов.
Как только вы получите этот блок данных,для исполнения вы хотите избежать дальнейших копий и использовать его на месте.В C ++ 17 у вас есть std::string_view
, который похож на std::string
, но использует существующие строковые данные, избегая копирования.В противном случае вы можете просто работать со строками в стиле C char*
, либо заменив символ новой строки на ноль (\0
), используя пару указателей (начало / конец) или указатель и размер.
ЗдесьЯ использовал string_view
, я также предполагал, что переводы строки всегда \n
и что в конце есть перевод строки.Возможно, вам придется настроить цикл, если это не так.Предполагая, что размер vector
также увеличит производительность, вы можете сделать это по длине файла.Я также пропустил некоторую обработку ошибок.
std::fstream is("data.txt", std::ios::in | std::ios::binary);
is.seekg(0, std::ios::end);
size_t data_size = is.tellg();
is.seekg(0, std::ios::beg);
std::unique_ptr<char[]> data(new char[data_size]);
is.read(data.get(), data_size);
std::vector<std::string_view> strings;
strings.reserve(data_size / 40); // If you have some idea, avoid re-allocations as general practice with vector etc.
for (size_t i = 0, start = 0; i < data_size; ++i)
{
if (data[i] == '\n') // End of line, got string
{
strings.emplace_back(data.get() + start, i - start);
start = i + 1;
}
}
Чтобы получить немного больше производительности, вы можете запустить цикл для выполнения работы ЦП параллельно с файловым вводом-выводом.Это может быть сделано с потоками или с помощью IO асинхронного файла для конкретной платформы.Однако в этом случае цикл будет очень быстрым, поэтому выигрыш будет невелик.