Я пытаюсь сделать связанную на основе очереди списка для быстрых операций, теперь это то, что у меня есть:Queue Алгоритмы
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 секунд). Итак, вопрос в том, что может быть лучшим алгоритмом? Я попытался понять реализацию MSVC std :: deque, но код настолько громоздкий для меня, чтобы понять.
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;
Просим предоставить дополнительную информацию. Какие операции вы обычно хотите делать? Насколько велик ваш набор данных? Какие данные вы хотите хранить в контейнере? Во всех случаях нет ни одного контейнера, поэтому вам нужно выбрать тот, который подходит для того, что вы хотите сделать. –
Я отредактировал вопрос, и я понимаю, что во всех случаях нет ничего лучшего, я просто пытаюсь найти лучший алгоритм, чем метод линейного удаления, с которым я сталкиваюсь. Я могу специализировать очередь для более точной настройки в соответствии с типом данных, но я предполагаю, что она должна работать как есть с примитивными типами данных. – SimpleButPerfect
Вы определили, что std: queue не достаточно быстро для вас? –
kenny