C++ STL size()是以恒定复杂性运行还是以线性运行?

C++ STL size()是以恒定复杂性运行还是以线性运行?,c++,stl,C++,Stl,哪个更高效,哪个更方便使用? std::vector<int> V(Some Integers); 1) for(int i=0 ; i<V.size() ; ++i){ std::cout<<V[i]<<" "; // print all integers } 2) int size=V.size(); for(int i=0 ; i<size ; ++i){

哪个更高效,哪个更方便使用?

    std::vector<int> V(Some Integers);

    1)

    for(int i=0 ; i<V.size() ; ++i){
         std::cout<<V[i]<<" "; // print all integers
    }

    2)

    int size=V.size();
    for(int i=0 ; i<size ; ++i){
      std::cout<<V[i]<<" "; // printing all integers
    }
std::vector V(一些整数);
1)

对于(int i=0;i < p>),取决于容器和C++标准的使用。例如,<代码>:ST:::(代码)>代码> > C++ 03 可以工作到线性复杂度。对于所有常用容器的<代码> C++ 14 < /COD>,<代码> siz()<代码> >(至少,
向量
列表
集合
映射
无序集合
无序映射
队列
deque
)以恒定时间运行。

size
通常以恒定时间运行。主要关注的是它是否会运行。编译器可以识别您所做的任何事情都不会改变大小,但它可能会失败。在这种情况下,您可以在每次迭代中调用一个函数,即使在恒定时间内也可能(或不会)要比简单的整数比较慢


如果您有一个复杂的容器(不是向量,其中的大小很可能已经是一个简单的变量),并且您正在对其元素执行复杂的操作(您没有更改大小,但编译器可能无法实现),并且您的时间非常有限(循环执行了数百万次),那么使用第二个版本是有意义的。

std::vector::size()
O(1)
(恒定)复杂度。我希望(1)和(2)在发布版本中无法区分;优化器应该能够将
size()
调用从循环中提升出来。但标准只说它是O(1)复杂性。它可能返回存储的大小值或计算
end-begin
指针差异。无论如何,如果关闭
inline
s(如在调试构建中),第一种方法将调用函数。第二种方法更可靠,速度更快。我建议
for(const auto&elem:V)
。它不仅保证只计算“结束条件”一次。它也更容易阅读。另外,从begin()到end()的迭代通常更有效,并且使用更惯用的for range循环。此外,+1。您要查找的异常是,它没有
size()
。对于那些想知道为什么会出现这种情况的人来说,在23.1中,
size()
没有强制要求具有恒定的复杂性,因为它说的是“应该有”,而不是“应该”。欢迎来到语言律师地狱。@duplicator比什么更有效?从
begin()
end()进行迭代吗
std::distance(s.begin(),s.end())
不同,后者具有线性复杂性?@uhosomebodyneedsAppUpper使用迭代器进行迭代通常比索引更有效。或者换言之:只有在遇到瓶颈且编译器不够智能时才进行优化。是的,您可以总结为:)