C++ 标准容器中尺寸的实现

C++ 标准容器中尺寸的实现,c++,stl,C++,Stl,这是一个纯粹的理论问题,我知道标准容器接口现在不太可能改变 我最近读了Herb Sutter的一篇“本周大师”的文章,他抱怨empty()在std::string中作为成员函数实现。我不同意所有的论点,因为例如,std::list需要相同函数的不同实现,因为size()是O(n),而empty()显然是O(1) 但是,标准规定(例如)std::string的empty()成员函数实现为“size()==0”,而不是“begin()==end()”,这有什么原因吗 在我看来,后者允许对所有容器使用

这是一个纯粹的理论问题,我知道标准容器接口现在不太可能改变

我最近读了Herb Sutter的一篇“本周大师”的文章,他抱怨empty()在
std::string
中作为成员函数实现。我不同意所有的论点,因为例如,
std::list
需要相同函数的不同实现,因为
size()
是O(n),而
empty()
显然是O(1)

但是,标准规定(例如)
std::string
的empty()成员函数实现为
“size()==0”
,而不是
“begin()==end()”
,这有什么原因吗

在我看来,后者允许对所有容器使用相同的O(1)实现
empty()
函数,我想不出有什么缺点。效率低吗

谢谢


N.G.

是的,它的效率较低,因为string::end()通常被实现为
返回(_string_ITERATOR(_Myptr()+this->_Mysize))


因此,使用size()==0可以减少添加的需要。

是的,它的效率较低,因为string::end()通常被实现为
返回(_string_ITERATOR(_Myptr()+this->\u Mysize))


因此,使用size()==0可以减少添加的需要。

该标准没有明确规定如何实现库中的任何内容。它只是指明了某事的意义。因此,如果
empty()
为true,则
size()
也必须为0。这并不意味着empty()必须实际调用
std::basic\u string::size()
,并将其与0进行比较。规范简单地说,如果
empty()
返回true,那么紧接着调用
size()
将返回0,如果
empty()
返回false,那么紧接着调用
size()
将不会返回0

规范可以说它的
begin()
将等于它的
end()
,并且它不会强制任何实现进行更改


这种不一致很可能是由于在C++98的开发过程中,
std::basic_string
类来自与其他STL容器不同的地方。这就是为什么它有如此多的成员函数来完成STL容器通常使用算法所做的事情。

该标准没有明确规定库中的任何内容是如何实现的。它只是指明了某事的意义。因此,如果
empty()
为true,则
size()
也必须为0。这并不意味着empty()必须实际调用
std::basic\u string::size()
,并将其与0进行比较。规范简单地说,如果
empty()
返回true,那么紧接着调用
size()
将返回0,如果
empty()
返回false,那么紧接着调用
size()
将不会返回0

规范可以说它的
begin()
将等于它的
end()
,并且它不会强制任何实现进行更改


这种不一致很可能是由于在C++98的开发过程中,
std::basic_string
类来自与其他STL容器不同的地方。这就是为什么它有如此多的成员函数来做STL容器通常会用算法来做的事情。

empty()
等同于
size()==0
的规范不是字面意义上的。代码片段仅显示函数的意图,而不是它们的具体实现方式

我在另一个论坛上从委员会成员那里得到了证实


在您的示例中,
size()。代码片段仅显示函数的意图,而不是它们的具体实现方式

我在另一个论坛上从委员会成员那里得到了证实


在您的示例中,
size()

那么长度()呢?同样简单——定义它的目的是给出与size()相同的结果。此外,请注意,其他容器没有length(),它作为一种“字符串东西”出现在基本的_字符串接口中,但通过使其成为非成员,我们可以一致地对任何容器说“length()”。在这种情况下不太有用,因为它只是size()的同义词,我承认,但它所说明的原理中值得注意的一点是——使算法立即成为非成员也会使它们更广泛地有用和可用


size()
作为成员函数的原因是,在大多数情况下,实现将缓存计算成本较高的容器的值(即,对于列表或映射,所包含元素的数量存储在容器本身中,以避免必须遍历结构),为了遵守标准中的建议,即
size
应为
O(1)
操作(§23.1/5)。

赫伯建议将
length()
作为非成员函数,按照
size()
实现,并与
empty()
等效:

那么长度()呢?同样简单——定义它的目的是给出与size()相同的结果。此外,请注意,其他容器没有length(),它在基本的_字符串接口中作为一种“st”