Могу ли я использовать std::string_view с getline при разборе файла?

Недавно я узнал о std::string_view и о том, что это намного быстрее, чем выделение строк, поэтому я пытаюсь использовать его вместо std::string, где это возможно.

Есть ли способ оптимизировать цикл, который анализирует файл построчно, чтобы вместо этого использовать std::string_view?

Это код, над которым я работаю.

    std::string line;

    // loop until we find the cabbage tag
    while (std::getline(csd, line))
    {
        //DO STUFF
        if (line.find("</STOP>") != std::string::npos)
            break;
    }

person Michael Grinnell    schedule 09.11.2020    source источник
comment
Вам по-прежнему нужен std::string для владения данными (getline просто считывает символы из потока и должен их куда-то поместить). Но вы можете создать представление просто с помощью std::string_view lineView = line; и перейти оттуда к синтаксическому анализу.   -  person parktomatomi    schedule 09.11.2020
comment
Для getline вам все равно нужен std::string, тогда вы можете использовать string_view для find, но мне это не имеет смысла - это ничего не ускорит.   -  person pptaszni    schedule 09.11.2020


Ответы (2)


То, что вы ищете, это mmap, которое позволяет вам читать данные файла, не копируя их. Чтение из потока в C++ всегда будет копировать данные. Затем вы можете, конечно, использовать std::string_view, чтобы указать на данные, обнаруженные mmap, и выполнять все операции, которые вам нравятся.

person Kostas    schedule 09.11.2020
comment
mmap для системы posix, в windows есть CreateFileMapping - person MatG; 24.06.2021

No. A string_view is:

  • Постоянное представление в какое-то хранилище, так что вы не можете читать в string_view
  • Не владеет хранилищем, а вместо этого ссылается на какое-то другое хранилище, поэтому getline некуда поместить прочитанную информацию.

Однако, как только вы прочитаете данные в string, вы можете создать string_view и передать его подпрограмме для синтаксического анализа (избегая передачи копии в этом случае).

person Marshall Clow    schedule 09.11.2020