【发布时间】:2011-01-15 13:29:57
【问题描述】:
我正在尝试为快速操作创建一个基于链表的队列,现在这就是我所拥有的:
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;
}
};
非常简单,现在我遇到的问题是 clear() 函数。 释放队列中的所有节点似乎花费了太多时间(7 秒)。 所以问题是,什么可能是更好的算法?我试图理解 MSVC 对 std::deque 的实现,但代码太庞大了,我无法理解。
编辑: 队列应该是通用的,允许对任意类型的数据进行排队。 这是我的测试代码(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;
【问题讨论】:
-
请提供更多信息。您通常想做哪些操作?你的数据集有多大?你想在容器中存储什么数据?没有一种容器在所有情况下都是最好的,因此您需要选择一种适合您想要做的事情。
-
我已经编辑了这个问题,我确实意识到在所有情况下都没有什么是最好的,我只是想找到一个比我使用的线性删除方法更好的算法。我可以根据数据类型专门化队列以进行更多微调,但我猜它应该与原始数据类型一样工作。
-
您确定 std:queue
的速度不足以满足您的需要吗? -
是的,std::queue
对于我快速推送和弹出的需求来说非常慢。 -
SimpleButPerfect:你在推动什么?你想创建一个队列或堆栈,还是其他什么?你按什么顺序推送和弹出(即你是混合它,还是先做所有推送,然后弹出)?
标签: c++ algorithm performance queue