我是C ++的新手,拥有更多的C经验。
我正在编写一个将使用字符串类的程序,并开始怀疑“length()”方法的效率。
我意识到我对这个问题没有一个好的答案,所以想知道这个和类似问题的答案是否存在于某个地方。虽然我能够确定自己代码的运行时间,但是在提供代码方面我有点失落,所以我发现我无法准确判断程序的效率。
是否有c ++文档(在线或以“man”格式)包含有关所提供代码的运行时的信息?
编辑:我对此感兴趣,而不仅仅是string :: length。
答案 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}}是恒定时间。