2012-05-29 2 views
2

У меня есть очередь. Если он превышает размер X, когда я нажимаю элемент, я хочу удалить первый элемент очереди. (Последний элемент, который получил бы выскочил и первый элемент, помещенный в)Удаление первого элемента из очереди?

void ClientPlayerManager::queueTableMessage(const std::string& playerName, const std::string& message) 
{ 
    m_tableQ.push(std::make_pair(playerName,message)); 

    if(m_tableQ.size() > m_maxTableMessages) 
    { 
     //m_tableQ.pop_back(); does not exist 
    } 
} 

Есть ли способ сделать это с очередью станда?

Благодаря

+0

В очереди FIFO последний элемент, который будет всплывать, находится на противоположном конце от первого введенного элемента. Что вы хотите? –

+0

Да, это довольно запутанно. Почему бы просто не использовать push и pop и забыть об этом? –

ответ

4

Вы можете использовать std::deque вместо std::queue, который поддерживает push_front, push_back, pop_front и pop_back. Это также допускает случайный доступ повсюду, но вы можете просто проигнорировать это и обработать deque как двойную очередь. (Фактически, deque не подходит для очереди с двойным концом).

Надеюсь, это поможет!

+0

Да, это то, что мне нужно. Благодарю. – jmasterx

0

Если вы хотите удалить элемент с противоположного конца от чего pop делает, просто пропустите толкая его в первую очередь:

if(m_tableQ.size() < m_maxTableMessages) { 
    m_tableQ.push(std::make_pair(playerName,message)); 
} 
+0

Нет, идея состоит в том, что я хочу, чтобы верхние X-сообщения оставались, когда у меня есть X-сообщения, одна из наименее важная (самая старая), и новая. Входит в – jmasterx

+0

@Milo: В этом случае вы можете просто используйте 'pop'. –

0

Here это еще один способ сделать это. Использует реализацию очереди на основе STL.

+0

Извините, но я не понимаю, как это отвечает на вопрос. Предположительно, OP уже использует 'std :: queue', но хочет удалить из него последний элемент, который, естественно, не поддерживается' std :: queue'. – templatetypedef