【问题标题】:Can I use std::string_view with getline when parsing a file?解析文件时可以将 std::string_view 与 getline 一起使用吗?
【发布时间】:2021-02-21 12:27:46
【问题描述】:

我最近了解了 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;
    }

【问题讨论】:

  • 您仍然需要std::string拥有数据(getline 只是从流中读取字符并需要将它们放在某处)。但是您可以简单地使用std::string_view lineView = line; 创建一个视图,然后从那里进行解析。
  • 对于getline,无论如何您都需要std::string,然后您可以将string_view 用于find,但这对我来说没有意义——它不会加快任何速度。

标签: c++ string c++17 string-view


【解决方案1】:

您正在寻找的是mmap,它允许您读取文件的数据而无需复制它们。在 C++ 中从流中读取总是会复制数据。然后你当然可以用std::string_view指向mmap透露的数据,做你喜欢的操作。

【讨论】:

  • mmap 用于posix系统,在windows中有CreateFileMapping
【解决方案2】:

没有。 string_view 是:

  • 对某些存储的持续查看,因此您无法读取string_view
  • 不拥有存储空间,而是“引用”其他存储空间,因此getline 无处放置它读取的信息。

但是,一旦将数据读入 string,您就可以创建 string_view 并将其传递给例程进行解析(避免在这种情况下传递副本)。

【讨论】:

    猜你喜欢
    • 2018-03-22
    • 2022-10-07
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多