【问题标题】:What algorithm does STL size() use to find the size of a string or vector?STL size() 使用什么算法来查找字符串或向量的大小?
【发布时间】:2016-02-03 16:58:27
【问题描述】:

STLsize() 函数在 C++ 中使用哪种算法或思想来查找字符串或向量的大小?

我知道strlen() 的工作取决于在 C 风格的 char 数组中找到 NUL 字符,但我想知道 size() 函数如何工作以查找不为空的字符串的大小正如我们所知,已终止。

STL 容器是否使用某种指针来标记容器的结束?

这是否有助于找到尺寸或其他东西?

【问题讨论】:

  • size() 必须是常数时间操作。
  • 没有算法。只有一个变量可以跟踪容器中的项目数。
  • 算法是“返回存储值”。
  • 在什么情况下停止跟踪,因为没有引用或空字符之类的东西?
  • @DanielKamilKozar:据我所知,没有指定算法,stringvector 可能会也可能不会存储其大小。只要可以在恒定时间内计算大小,实现就可以做任何它喜欢的事情。它可能会检索一个存储的长度,或者它可能会检索一个以字节为单位的大小并除以元素大小,或者它可能会做一个指针减法。

标签: c++ string stl


【解决方案1】:

它不使用任何算法。这个类总是知道它的大小。

【讨论】:

    【解决方案2】:

    标准没有指定如何 size() 是如何计算的,只是计算是在恒定时间内完成的(例如,计算 1000 元素向量的大小不需要 10计算 100 元素向量大小的时间)。

    具体算法可能因一种实现而异。在存储当前大小的类中可能有一个隐藏的成员变量,size() 只是检索它的值。或者它可能以字节为单位存储大小,size() 检索它并除以元素大小。或者对象可能存储指向序列开头和结尾的指针,然后size() 可以使用指针算法计算大小。

    您只需要知道并且您应该关心的是size() 为您提供了元素的数量,而且对于大字符串/向量而言,它并不比对于小字符串/向量更昂贵。 (与 strlen() 不同,正如您所指出的,对于较长的字符串,它的速度较慢。)

    【讨论】:

      【解决方案3】:

      如果您查看herehere,您会发现std::vector.size()std::string.size() 的时间复杂度都在恒定时间内运行。这是因为向量存储了两个指针,vector.begin()vector.end()。要找到向量(或字符串)的大小,只需将两者相减即可找到大小。

      返回容器中元素的数量,即std::distance(begin(), end())

      【讨论】:

        【解决方案4】:

        Vector implementation

            // [23.2.4.2] capacity
              /**  Returns the number of elements in the %vector.  */
              size_type
              size() const _GLIBCXX_NOEXCEPT
              { return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); }
        

        它只是减去完成索引 - 开始索引以获得大小。

        【讨论】:

          【解决方案5】:

          大多数情况下size() 将实现类似

          size_t A::size() {
              return len;
          }
          

          其中A 是一个类,len 是类的数据成员。因此时间恒定。 其次,一些实现可能会使用pointer arithmatics,它仍然是恒定时间算法。 只要有可能,我会采用第一种方法

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-06-28
            • 2015-09-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-03-16
            • 2020-04-30
            相关资源
            最近更新 更多