Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字符串类的C++ 如何对STD::String类工作C++长度方法?谢谢。 C++的大多数字符串类将字符串的长度保持在一个单独的成员中,所以它们的长度方法只返回那个缓存值。_C++_String - Fatal编程技术网

字符串类的C++ 如何对STD::String类工作C++长度方法?谢谢。 C++的大多数字符串类将字符串的长度保持在一个单独的成员中,所以它们的长度方法只返回那个缓存值。

字符串类的C++ 如何对STD::String类工作C++长度方法?谢谢。 C++的大多数字符串类将字符串的长度保持在一个单独的成员中,所以它们的长度方法只返回那个缓存值。,c++,string,C++,String,首先计算以零结尾的字符串的长度很容易:从第一个元素开始,并不断递增计数器,直到到达表示字符串结尾的二进制0为止。这正是strlen所做的。std::string类有几个构造函数,包括一个同时接受const char*raw C字符串和size\t长度的构造函数,另一个只接受const char*raw C字符串。对于前者,存储提供的长度,对于后者,通过调用strlen或执行等效计算来计算一次长度。调用std::string::lengthcont只返回先前计算的值。它不会在每次调用时重新计算。它

首先计算以零结尾的字符串的长度很容易:从第一个元素开始,并不断递增计数器,直到到达表示字符串结尾的二进制0为止。这正是strlen所做的。

std::string类有几个构造函数,包括一个同时接受const char*raw C字符串和size\t长度的构造函数,另一个只接受const char*raw C字符串。对于前者,存储提供的长度,对于后者,通过调用strlen或执行等效计算来计算一次长度。调用std::string::lengthcont只返回先前计算的值。它不会在每次调用时重新计算。

它在大多数实现中不起作用。它只是通过返回其他方法努力维护的值来进行欺骗:

从libstdc++string.h:


顺便说一句,Java中也会发生同样的事情。显然,长度方法是惯用的骗子…

字符串类是什么?你指的是std::string吗?如果是,则它没有len成员函数。你指的是其他字符串类吗?毕竟还有几十个其他的字符串类可供选择?所以,基本上,你只需运行strlen一次,然后将该数字存储在某种字符串结构中?@Dervin Thunk:std::string支持嵌入的空字符,所以strlen的内部缓冲区中永远不会运行,因为这将返回太小的数字。它只是在修改字符串时跟踪有效的数据长度。string知道字符串的长度何时更改,因此它可以根据需要更新缓存的长度。例如,如果您构造一个std::stringabc,它将计算字符串的长度,分配足够的存储空间,并随长度一起存储一个副本。@ildjarn:太小或太高。:@托马拉克·格雷特卡尔:说得好。我特别考虑了字符串的数据包含嵌入的null的情况,但是您是对的-std::string不保证null终止其缓冲区,因此,在缓冲区上运行strlen可能是病态的。C++03标准规定std::basic_字符串的大小和长度成员函数应具有恒定的复杂性§23.1/5。因此,一致性实现在每次调用时重新计算长度在技术上是可能的,但我非常怀疑当前的标准库实现是否真的做到了这一点。@ildjarn:恒定的复杂性不是意味着O1吗?有可能在小于On的时间内计算字符串的长度吗?@thkala:是的,恒定的复杂性意味着O1,但这里的关键词是“应该”-标准没有规定一致性实现必须有O1大小和长度,只是要求它们应该有。@ildjarn:啊,对。RFC风格动词。我存在的祸根和一个很好的争论来源:-@thkala:在这种情况下,标准明确区分了必须和应该——例如,空成员函数必须是O1。但是,正如我所说,我非常怀疑任何广泛使用的标准库实现都没有O1大小。你说的骗子是什么意思?什么规则会被打破?@Michael J:OP问了一个可以说是宽泛而模糊的问题,关于长度方法是如何工作的。我觉得有必要开玩笑地回答,它实际上什么都不做——它只返回一个现有的值。挖苦是针对问题,而不是长度:-看来发问者是个新手,你的评论可能只会让他感到困惑。与其取笑新手,不如帮助他们。我们一生中都曾是初学者-@米迦勒:OP可能是C++中的新手,但是在StAdppOver上有2K以上的声誉。他们现在应该知道问题需要更多的关注。在编辑之前,最初的问题几乎无法理解。这一次,没有提到OP需要帮助理解的具体事情,表明在发布问题之前缺乏研究……好吧,如果你觉得有必要贬低别人,那就这样吧。我有比和你争论更好的事情要做。
///  Returns the number of characters in the string, not including any
///  null-termination.
size_type
length() const
{ return _M_rep()->_M_length; }