私は今、それは私が持っているものだ、速い操作のためのリンクリストベースのキューを作成しようとしています:キューアルゴリズム
template< typename T,
template<typename> class Allocator = default_allocator
>
class fast_queue
{
public:
typedef T element_type;
typedef T* element_ptr;
private:
typedef struct e_node
{
element_type val;
e_node * next;
}node_type;
typedef node_type * node_ptr;
node_ptr parent;
node_ptr child;
int m_size;
typedef Allocator<node_type> allocator_type;
public:
fast_queue()
: parent(0)
, child(0)
, m_size(0)
{
}
~fast_queue() {
this->clear();
}
void push(element_type& i)
{
node_ptr n = allocator_type::alloc();
n->val = i;
n->next = (node_ptr)0;
if(child) {
child->next = n;
} else {
parent = n;
}
child = n;
m_size++;
}
element_type pop()
{
element_type ret = parent->val;
node_ptr p = parent;
parent = parent->next;
m_size--;
allocator_type::dealloc(p);
return ret;
}
inline int size() const
{
return m_size;
}
inline bool empty() const
{
return (m_size == 0);
}
void clear()
{
while(!empty()) {
pop();
}
child = 0;
}
};
かなり簡単、今何私は問題を抱えていることは明らか()関数です。 キュー内のすべてのノードの割り当てをあまりにも多くの時間を取っているようです(7秒)。 問題は、より良いアルゴリズムは何でしょうか?私はstd :: dequeのMSVCの実装を理解しようとしましたが、コードはわかりやすいものです。
EDIT: キューは汎用的で、任意のタイプのデータをキューに入れることができます。他の人々によって示唆されるようにここで は私のテストコード(Windowsの場合)
DWORD time1 = timeGetTime();
fast_queue<int> queue;
for(int i = 0; i < 100000; i++) {
queue.push(i);
}
queue.clear();
cout << "Test time: " << (int)(timeGetTime() - time1) << " milliseconds" << endl;
詳細をお知らせください。通常どんな操作をしたいですか?あなたのデータセットの量はどれくらいですか?コンテナにどのようなデータを保存しますか?すべてのケースで最高のコンテナは1つもないので、あなたがしたいことに適したコンテナを選択する必要があります。 –
私は質問を編集しましたが、私はすべての場合において最高のものは何もないことを認識しています。私は、リニア削除方法よりも優れたアルゴリズムを探しています。 データ型に応じてキューを細かく調整することができますが、プリミティブデータ型をそのまま使用する必要があります。 – SimpleButPerfect
std:queueが必要なだけ速くないと判断しましたか? –
kenny