1

入力をすばやく行う方法を見つけようとしていますが、そのような目的で STL を使用すると時間がかかる可能性があることを知りました。

キーボード入力を取得するたびに起動するコールバックがあります。でオブジェクトを作成します(int _key, int _state, int _life)

このコールバックを受け取るたびにpush_back、std::vector へのオブジェクトを取得します。

フレームごとに、このベクトルの上部をチェックし、「デッド」入力を削除します。

ベクトルは、その時点で有効な入力に対してポーリングできます。これは、頻繁に検索されることを意味します。

最適化:

-すべてのメモリは連続している必要があるため、動的割り当てにはリンク リストの方が適していますが、STL のベクトルを使用する必要がありますか? 私は常に上に追加し、下から削除しているので、どのデータ構造体を使用すればよいですか?

-コールバックから新しい入力を継続的に受け取るバッファ(2番目のベクトル)を用意し、各フレームでそのベクトルからアクティブな入力ベクトルの先頭にデータをコピーすることを考えていました。アクティブなベクトルがポーリングされるため、ループ中に追加される時間を無駄にしないため、パフォーマンスが向上しますか?

基本的に、このベクトルから可能な限り多くのパフォーマンスを絞り出そうとしていますが、助けが必要です。

4

4 に答える 4

3

片方の端でデータを追加し、もう片方の端でデータを削除して説明しているのは、キューの典型的な説明です。std::queueこれは、クラスとともに標準ライブラリに実装されます。

このキュークラスはいわゆるコンテナアダプタであり、実際のストレージに別のコンテナを使用することを意味します。デフォルトではを使用しますstd::dequeが、そのコンテナはデータを連続したメモリ領域に保持しません。std::queueただし、次のような他のほとんどすべての標準コンテナで宣言できますstd::vector(これは、連続したメモリ領域にデータを格納することが保証されている唯一のコンテナです)。

std::queue<int, std::vector> my_queue_with_vector;
my_queue_with_vector.push(1);
my_queue_with_vector.push(2);
my_queue_with_vector.push(3);

while (!my_queue_with_vector.empty())
{
    std::cout << my_queue_with_vector.top() << '\n';
    my_queue_with_vector.pop();  // Remove top element in the queue
}
于 2012-12-12T13:09:22.357 に答える
3

std::deque最高の容器を作ります。O(1) の pop_front と push_back()保証し、ランダム アクセスと適切な (完全ではありませんが) キャッシュ動作を備えています。

ただし、絶対に完全な連続性が必要な場合は、カスタムの循環バッファー コンテナー (Boost IIRC にある) を調べる必要がありますvector

編集: 別の投稿者が指摘しているように、非常に高速なタイピストであっても、キーボード入力は非常にまれであるため、これがシステムのボトルネックであるとは信じがたいです。

于 2012-12-12T13:05:27.470 に答える
1

あなたが欲しいように聞こえますstd::deque。隣接する要素は、ほとんどの場合、メモリ内で継続的に割り当てられ、開始時と終了時に一定時間の挿入と削除が行われます。

于 2012-12-12T13:00:51.350 に答える
0

簡単な答え: 関係ありません。std::vector と std::list は、1 秒あたり数百万の挿入操作を簡単に処理できますが、ほとんどのタイピストは、キーボードで 1 秒あたり 10 文字より速く入力することはありません。

長い答え: ベクターが小さく (< 100)、ベクターに格納されているオブジェクトのコピー/スワップ操作が安価な場合、push_back と erase は通常、ベクター上で非常に安価です。std:list への挿入または std:list からの削除に使用される割り当ては、通常、より高価です。それが問題になる場合は、コストを測定します。

std::deque にも割り当てがあり、実装によっては、ベクトルに 10 個を超えるアイテムが含まれることはめったにないという私の仮定が正しい場合、実装によってはベクトルよりも高価になる可能性があります。

于 2012-12-12T13:03:51.323 に答える