是STL size()在恒定复杂度或线性上运行

Is STL size() runs on constant complexity or Linear?

本文关键字:复杂度 线性 运行 size STL      更新时间:2023-10-16

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

    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
    }

这取决于所使用的容器和c++标准。例如,C++03中的std::set::size()可以达到线性复杂度。对于C++14size(),所有常用容器(至少vectorlistsetmapunordered_setunordered_mapqueuedeque)的运行时间都是恒定的。

size通常以常数时间运行。人们主要担心的是它能否运行。编译器可以识别出您所做的任何操作都没有改变大小,但它可能无法这样做。在这种情况下,您可以在每次迭代中调用一个函数,即使在常量时间内,也可能(或不会)比简单的整数比较慢。

如果你有一个复杂的容器(不是一个向量,其中的大小很可能已经是一个简单的变量),你正在对它的元素做复杂的事情(你没有改变大小,但有可能编译器不会意识到这一点),你的时间非常紧张(循环执行了数百万次),那么使用第二个版本可能是有意义的。