代码之家  ›  专栏  ›  技术社区  ›  Beyondo

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

  •  2
  • Beyondo  · 技术社区  · 6 年前

    我想知道最快的方法是什么 std::string 对象
    表示最后一次出现后的字符串 \n 以最快的方式?

    3 回复  |  直到 6 年前
        1
  •  4
  •   Galik    6 年前

    我可能会用 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') 找不到它返回的任何内容 标准::字符串::NPO . 这个 C++ 标准说 std::string::npos + 1 == 0 . 归还 s.substr(0) 总是安全的。

    如果 S.RDebug('\n) 如果找到了某些内容,则希望子字符串从下一个字符开始。再次回归 s.substr(s.size()) 按照标准是安全的。

    注: C++17 这种方法将受益于 保证收益值优化 所以它应该是超高效的。

        2
  •  6
  •   kmdreko    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

        3
  •  0
  •   Beyondo    6 年前

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

    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' 字符,然后将存储的字符串反转回来并返回它。如果目标字符串很大并且有很多新行,那么这个函数将非常有效。