读取字符串最后一行的最快方法?

时间:2018-12-10 20:05:01

标签: c++ string stdstring

我想知道什么是读取std::string对象中最后一行的最快方法
是指以最快的方式最后一次出现\n之后的字符串?

3 个答案:

答案 0 :(得分:6)

可以仅使用string::find_last_ofstring::substr来完成此操作

std::string get_last_line(const std::string &str)
{
  auto position = str.find_last_of('\n');
  if (position == std::string::npos)
    return str;
  else
    return str.substr(position + 1);
}

请参阅:example

答案 1 :(得分:4)

我可能会结合使用std::string::rfindstd::string::substr和有保证的std::string::npos来使其简洁:

inline std::string last_line_of(std::string const& s)
{
    return s.substr(s.rfind('\n') + 1);
}

如果s.rfind('\n')未找到任何内容,则返回std::string::nposC++标准说std::string::npos + 1 == 0。返回s.substr(0)总是很安全。

如果s.rfind('\n')确实找到了某些内容,则您需要从下一个字符开始的子字符串。根据标准,再次返回s.substr(s.size())是安全的。

注意::在C++17中,此方法将受益于保证的返回值优化,因此它应该超级有效。

答案 2 :(得分:0)

我想到了一种在存储所读取内容的同时反向(向后)读取字符串的方法

std::string get_last_line(const std::string &str)
{
    size_t l = str.length();
    std::string last_line_reversed, last_line;
    for (--l; l > 0; --l)
    {
        char c = str.at(l);
        if (c == '\n')
            break;
        last_line_reversed += c;
    }
    l = last_line_reversed.length();
    size_t i = 0, y = l;
    for (; i < l; ++i)
        last_line += last_line_reversed[--y];
    return last_line;
}

直到它计数器'\n'字符,然后将存储的字符串反向返回并返回。如果目标字符串很大并且有很多新行,则此功能将非常有效。