std::string构造std::string_view的时间复杂度是线性还是常量?
你给出的测试代码如下:
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; }
两个构造调用的逻辑及时间复杂度
- 构造
sV时调用的是适配std::string类型的构造重载。std::string内部本身存储了底层字符数组的首指针和字符串长度,构造string_view只需要把这两个值拷贝到string_view的内部成员即可,时间复杂度为常量O(1),和s的字符数量完全无关。 - 构造
sVTwo时调用的是迭代器版本的构造重载。std::string的迭代器属于随机访问迭代器,两个随机访问迭代器的差值计算是O(1)操作,再把首迭代器对应的地址和计算得到的长度赋值给string_view内部成员,整体时间复杂度也是常量O(1),不会随字符串长度变化。
只有当传入的迭代器是输入迭代器、前向迭代器这类不支持O(1)求距离的迭代器类型时,迭代器版本的string_view构造才会是线性复杂度,你这里用std::string的迭代器不属于这类情况。
内容的提问来源于stack exchange,提问作者Hisham Hijjawi
相关产品推荐
相关产品推荐

