C++ string_view

今天遇到C++中string的性能问题,换成string_view好了一点。其实这是我第二次使用string_view,但是第一次不求甚解,这一次要查查资料。

微软的文档里说,string_view可以提高类string数据的读取的速度。

又看了几篇博客,string_view可以在常数时间内完成substr()操作。没有真正拷贝子字符串,而是记录指针。

后面还有一些详细的解释,我就不复制粘贴了,简单来说,string_view让C++处理字符串以及字符串片段更快,但是只读。是对C格式的指针的一种封装,直接读取某段内存。

下面是同样的逻辑实现的LeetCode 1754题,唯一的区别是,第二种方法使用string_view来接收参数。虽然LeetCode上面的算法跑的时间非常玄学,但是量级的差距还是存在的。string_view在读取子字符串时,无论是时间还是空间,优势都非常明显。

class Solution {
 public:
  string largestMerge(string word1, string word2) {
    string res;
    const int m = word1.size(), n = word2.size();
    int i = 0, j = 0;
    while (i < m && j < n)
      res += word1.substr(i) > word2.substr(j) ? word1[i++] : word2[j++];
    res.append(word1.substr(i));
    res.append(word2.substr(j));
    return res;
  }
};
class Solution {
 public:
  string largestMerge(string_view word1, string_view word2) {
    string res;
    const int m = word1.size(), n = word2.size();
    int i = 0, j = 0;
    while (i < m && j < n)
      res += word1.substr(i) > word2.substr(j) ? word1[i++] : word2[j++];
    res.append(word1.substr(i));
    res.append(word2.substr(j));
    return res;
  }
};