gpt4 book ai didi

c++ - 如果可能的话,总是喜欢std::string(ptr,size)而不是std::string(first,last)吗?

转载 作者:行者123 更新时间:2023-12-01 14:39:34 25 4
gpt4 key购买 nike

考虑:

#include <string>
#include <string_view>

using namespace std;

string sv2s_1(string_view sv)
{
return string(sv.data(), sv.size());
}

string sv2s_2(string_view sv)
{
return string(sv.begin(), sv.end());
}

sv2s_1中, string最多需要分配一次内部缓冲区。

sv2s_2中, string不知道内部缓冲区应该有多大,因此它必须一次推回字符,并且可能会多次重新分配和复制内部缓冲区。

假设 firstlast随机访问迭代器string(first, last)可以使用 last - first快速获取其内部缓冲区的大小,因此性能与 string(ptr, size)相等。

问题:如果 first last是随机访问迭代器,

在性能方面,C++标准是否保证 string(first, last) string(ptr, size) 等效?

最佳答案

我认为标准中没有这样的要求。标准saysX(i, j)构造一个等于范围[i, j)的序列容器,并且表达式的复杂性取决于序列。

查看特定的实现,libstdc++ precomputes前向,双向和随机访问迭代器的范围大小:

template<typename InIterator>
void basic_string<CharT, Traits, Alloc>::
_M_construct(InIterator beg, InIterator end, std::forward_iterator_tag) {
// ...
size_type dnew = static_cast<size_type>(std::distance(beg, end));
// ...
}

请注意, std::bidirectional_iterator_tag中的 std::random_access_iterator_tagstd::forward_iterator_tag are derived可以隐式转换为它,因此,此 _M_construct重载被称为正向,双向和随机访问迭代器(在C++ 20中为连续的迭代器)。

关于c++ - 如果可能的话,总是喜欢std::string(ptr,size)而不是std::string(first,last)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61265039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com