是否允许std :: vector :: size()需要非平凡的计算?什么时候才有意义?

sha*_*oth 4 c++ stl vector std

我正在查看一段代码并查看一个类,其中一个std::vector存储为成员变量,并且其大小std::vector存储为单独的成员变量.无论std::vector和大小的其"存储副本"包含的对象生命周期内都不会改变,并评论说,大小分别存储"为方便和当执行每次计算尺寸的情况下 ".

我的第一反应是"WT*?提取std::vector尺寸不应该总是微不足道吗?"

现在我仔细阅读了C++ Standard的23.2.4并且看不到任何关于这些实现是否被允许的东西,我无法想象为什么有必要以std::vector这样的方式实现它的当前大小需要非 - 计算机.

这样的实现是否std::vector::size()需要允许一些非平凡的操作?什么时候有这样的实施有意义?

GMa*_*ckG 7

C++ 03在§23.1中的表65中说,size()应该具有恒定的复杂性.(在C++ 0x中,这是所有容器都需要的.)你很难找到std::vector<>它不在的地方.

通常,正如史蒂夫所说,这只是两个指针之间的区别,一个简单的操作.


Ste*_*sop 6

我猜你的"琐碎"的定义与代码作者的定义不匹配.

如果size没有存储,我希望beginend存储,并size计算为两者的差异,以及要内联的代码.所以我们基本上是在谈论两个(附近的)内存访问和一个减法,而不是一个内存访问.

对于大多数实际目的,这些都是微不足道的,如果标准库作者认为计算的结果不值得缓存,那么我个人很乐意接受他们的意见.但该代码评论的作者可能会另有想法.

IIRC标准说size"应该"是O(1),不确定序列或容器的文本是否存在.我不认为它在任何地方指明它必须vector.但是,即使我们将其视为非要求,也存在一个基本的QOI问题 - 我究竟在以正常实现为代价来优化我的代码以实现如此糟糕的实现?

如果有人使用这样的实现,大概是因为他们希望他们的代码运行缓慢.除此之外,我该判断谁?;-)

代码的作者也可能使用许多end-begin实现进行了分析,并通过缓存大小来衡量显着的改进.但我认为这不太可能是作者对他们的代码需要处理的最坏情况过于悲观.