我想知道什么是读取std::string
对象中最后一行的最快方法
是指以最快的方式最后一次出现\n
之后的字符串?
答案 0 :(得分:6)
可以仅使用string::find_last_of
和string::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::rfind和std::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::npos。 C++
标准说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'
字符,然后将存储的字符串反向返回并返回。如果目标字符串很大并且有很多新行,则此功能将非常有效。