4

最近、Cocoa(この場合はTouch)にキューが組み込まれていないことがわかりました。なぜだめですか?キューは、コンピュータープログラミングにおける最も基本的なデータ構造の1つです。

の使用を提案する人もいますがNSMutableArray、これはインデックス0のオブジェクトを削除する必要があるため、ポップ/デキューには非常に非効率的です。これにより、すべての要素が下にシフトし(現在は空のエントリに向かって)、Oが取得されます。 (n)各削除操作の時間。私は何かが足りないのですか、それともキューがCocoaに追加されなかった理由がなかったのですか?

4

4 に答える 4

12

の使用を提案する人もいますがNSMutableArray、これはインデックス0のオブジェクトを削除する必要があるため、ポップ/デキューには非常に非効率的です。これにより、すべての要素が下にシフトし(現在は空のエントリに向かって)、Oが取得されます。 (n)各削除操作の時間。

これは正しくありません。NSMutableArrayヘッド挿入を非常に効率的に処理し、キューやスタックなど、さまざまなデータ構造に使用できます。

于 2012-05-31T13:13:51.227 に答える
8

AppleはCFTypesをOpenSourceとしてリリースします—そしてそれらはNSArray、NSDictionary、…(「フリーダイヤルブリッジング」)としてのオブジェクト指向コレクションのコアデータ型です。

したがって、CFArray.cを見ると、includesを見るだけでわかります#include "CFStorage.h"。これは、実際にデータを傷つけるタイプである必要があります。

わかりました。CFStorage.hを見てください。これはコメントにあります。

CFStorageは、バランスの取れたツリーを使用して値を格納します。これは、潜在的に多数の値(100バイト以上の価値)が格納され、多くの編集(挿入と削除)が行われる状況に最適です。

アイテムへのアクセスはO(log n)ですが、最後の結果をキャッシュすると、これが一定時間に短縮されることがよくあります。

ergo
「NS(Mutable)Array」という名前は、それがどのように実装されているかではなく、より高いレベルでどのように機能するかを説明しています。そして、実装は、単なるリストよりもはるかに洗練されており、配列が意味します。


クローズドソースに入るときにアップルがCFTypesを変更しているかどうかはわかりません。そのため、CFTypesソースを調べてもすべてが説明できるとは限りません。

いくつかの数字とチャート: http: //ridiculousfish.com/blog/posts/array.html

于 2012-05-31T14:06:15.590 に答える
4

AFAIK NSMutableArrayは内部で循環バッファを使用するため、キューに使用しても問題ないと思います。

于 2012-05-31T13:14:29.103 に答える
0

NSMutableArrayの周りに小さなラッパーを記述し、それをキューとして使用することは難しくありません。Appleはこれを行うことを提案しています。これを行うためにここに書いた実装があります

https://github.com/Machx/Zangetsu/blob/master/Source/CWQueue.m

Appleがこれをしないことに決めた理由については。誰が知っている、それはFoundationFrameworkエンジニアにとっての質問です。

于 2012-05-31T16:54:57.930 に答える