【问题标题】:Time complexity of converting std::string to std::string_view将 std::string 转换为 std::string_view 的时间复杂度
【发布时间】:2021-12-04 14:52:29
【问题描述】:

最小可重现示例:

using namespace std;

#include<string>
#include<string_view>
#include<iostream>

int main()
{
    string s = "someString";
    string_view sV = string_view(s);
    string_view sVTwo = string_view(begin(s), end(s));
    return 0;
}

创建 string_view sV 的时间复杂度是否与字符串 s 中的字符数成线性关系,还是与字符串 s 的长度无关?同样,sVTwo 的构造时间复杂度是线性的还是常数取决于字符串中有多少个字符?

我感到困惑的原因是我无法在这里分辨出这些构造函数中的哪一个:https://en.cppreference.com/w/cpp/string/basic_string_view/basic_string_view 正在用于构造字符串。

【问题讨论】:

  • 链接不是说复杂度是恒定的吗? std::string 知道自己的长度,因为它有一个 const size() 函数。当使用原始的char * 时,字符串的长度就起作用了,因为字符指针对字符串的长度一无所知,并且必须迭代直到达到空值。
  • 它没有使用任何string_view 构造函数。它使用的是“string to string_view" conversion operator.
  • Protip:永远不要将using namespace std; 放在#include 指令之上,最好不要使用using namespace,而是导入特定的类型名称。

标签: c++ string string-view


【解决方案1】:

创建string_view sV的时间复杂度是线性相对 到字符串 s 中的字符数还是与多长时间无关 字符串 s 是什么?

string_view(s)会调用stringoperator std::string_view(),相当于return string_view(data(), size()),由于stringdata()size()都是O(1),所以复杂度有与字符串的长度无关。

同样,sVTwo 的构造时间复杂度是线性的 还是常量取决于字符串中有多少个字符?

它将调用string_view(It first, End last)并使用std::to_address(first)last - first来初始化string_view的成员变量。由于前者和指针运算都是常数时间,所以这也是常数时间。请注意,该函数是在 C++20 中引入的,在 C++17 中调用 string_view(begin(s), end(s)) 是不正确的。

【讨论】:

    猜你喜欢
    • 2021-08-11
    • 2020-12-09
    • 2022-10-22
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2016-01-28
    相关资源
    最近更新 更多