vector :: size()如何在恒定时间内返回向量的大小?

时间:2019-01-30 08:37:17

标签: c++ c++11 stl

我正在研究C++ Reference,发现使用vector :: size()可以在恒定时间内返回向量的大小。但是,我不知道如何在不实际遍历向量的情况下获得大小。

3 个答案:

答案 0 :(得分:9)

它只是跟踪元素的数量。

如果更改,则该数字将更新。例如,当调用push_backemplace_back时,元素数增加1。这是std::vector本质上不是线程安全的众多原因之一。

您可以想象,这使得std::vector的实现非常灵活-其他C ++标准库容器也可以这样说-这是不尝试自己编写容器类的一个很好的理由。

答案 1 :(得分:8)

要了解这一点,您需要了解vector的工作原理。

一个好的心理模型是:

class vector
{
      T *data;.              // Pointer to the first element
      size_t size;         // Number of elements in use
      size_t capacity; // Number of elements available
};

无论何时添加元素:

  • 元素被构造
  • 大小增加

当容量不足时,我们应该扩展数据。简而言之,如果您查看push_back的代码,它将看起来像:

T& push_back(T const& t)
 {
      if (size == capacity)
            grow();
       constructAtEnd(t);
       ++ size;
        return back();
  }

在实践中,由于例外保证,它有点复杂。但是,鉴于上述情况,对于所有方法,您应该能够检查vector的实现并了解发生了什么情况。

答案 2 :(得分:0)

std::vector是STL中的序列容器,它具有一个变量,每次都会计数元素的数量。当我们push_back()到变量{{1}的任何元素递增时,以及我们std::vector的变量pop_back()的变量递减时。

所以我认为它像这样

  

因此std :: vector :: size()返回该变量的大小