c ++内置的效率

时间:2009-07-12 05:04:40

标签: c++ documentation performance

我是C ++的新手,拥有更多的C经验。

我正在编写一个将使用字符串类的程序,并开始怀疑“length()”方法的效率。

我意识到我对这个问题没有一个好的答案,所以想知道这个和类似问题的答案是否存在于某个地方。虽然我能够确定自己代码的运行时间,但是在提供代码方面我有点失落,所以我发现我无法准确判断程序的效率。

是否有c ++文档(在线或以“man”格式)包含有关所提供代码的运行时的信息?

编辑:我对此感兴趣,而不仅仅是string :: length。

2 个答案:

答案 0 :(得分:5)

我见过的所有实现都是O(1)。

您正在寻找的文档是C ++标准 - 我相信C ++ 03是目前最新的文档。它不是在线或以人工格式提供的,而是商业销售的。有一个找到它的地方列表,以及最近的价格,here

答案 1 :(得分:5)

目前,所有 STL容器size()的时间复杂度未得到详细说明。那是open C++ defect report

目前的ISO C ++标准规定STL容器应该具有size()的复杂性:

  

21.3 [lib.basic.string] / 2

     

类模板basic_string符合Sequence的要求,如(23.1.1)中所述。另外,因为basic_string支持的迭代器是随机访问迭代器(24.1.5),所以basic_string符合(23.1)中规定的可逆容器的要求。

     

23.1 [lib.container.requirements] / 5

     
      
  • 表达:a.size()
  •   
  • 复杂性:(注A)
  •   
     

标有''(注释A)''的条目应具有恒定的复杂性

但是,“应该”不是标准用语中的约束性要求;实际上,上面也适用于std::list,但实际上一些实现(特别是g ++)有O(N)std::list::size()

唯一可以保证的是,字符串(end() - begin())是(可能摊销的)O(1)。这是因为字符串迭代器保证是随机访问,并且随机访问迭代器保证具有恒定时间operator-

作为一个更实际的问题,对于所有现有的C ++实现,以下内容如下:

  • std::string::size()是O(1)
  • std::vector::size()是O(1)

它们是相当明显的,因为字符串和向量最有效地实现为具有单独存储大小的连续数组:连续因为它在满足所有其他复杂性要求的同时提供最快的元素访问,并且存储大小是因为容器需求要求{{ 1}}是恒定时间。