5


0

私はCにかなり慣れていないので、もっとCの経験が豊富です。

私は文字列クラスを使用するプログラムを書いています、そして "length()"メソッドの効率について疑問に思い始めました。

私はこの質問に対する良い答えがないことに気づきました、そしてこれと同様の質問に対する答えがどこかに存在するかどうか疑問に思いました。 私は自分自身のコードの実行時間を決定すること以上の能力を持っていますが、それが提供されたコードに関しては私は少し戸惑っています、そしてそれで私は私のプログラムの効率を正確に判断することができません。

提供されているコードの実行時に関する情報を含む(オンラインまたは "man"形式の)c文書がありますか?

編集:私は一般的にこれに興味がある、ただのstring

lengthではない。

2 Answer


5


私が見た実装はすべてO(1)です。

あなたが探している文書はC標準です - 私はC 03が現在最新のものであると思います。 それはオンラインでも男性のフォーマットでも利用できず、市販されています。 それを見つけるための場所、そして最近の価格のリストがあります。


5


現時点では、all STLコンテナの `+ size()+`の時間の複雑さは未指定です。 そのためにhttp://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#632 [Open C defect report]があります。

現在のISO C +標準では、STLコンテナには、一定の複雑さの「 size()+」が必要です。

_ _ ==== 21.3 [lib.basic.string] / 2

クラステンプレートbasic_stringは、(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)

文字列とベクトルの両方が、個別に格納されたサイズの連続した配列として最も効率的に実装されているため、それらは非常に明白です:隣接する他のすべての複雑さの要件を満たしながら最速の要素アクセスを提供し、コンテナの要件は `+ end() + `は一定時間です。