0

我想知道这段代码是否安全并且没有任何未定义的行为。

 QueueMap::const_iterator it = m_3playersQueue.find(s->m_GameCode);
 if(it == m_3playersQueue.end())
 {
     std::deque<Session*> stack;
     stack.push_back(s);

     m_3playersQueue[s->m_GameCode] = stack;
     return;
 }

 const_cast<std::deque<Session*>&>(it->second).push_back(s);

 QueueMap is of type std::tr1::unordered_map< uint32, std::deque<Session*> >
4

3 回答 3

4

您的代码自相矛盾。只需使用QueueMap::iterator而不是QueueMap::const_iterator.

您正在做的是明确地将其设置为 const,然后const_cast消除constness。何苦?

于 2012-05-19T17:13:55.810 回答
1

以下形式的代码可能更易于理解:始终插入和更新:

std::pair<QueueMap::iterator, bool> p =
  m_3playersQueue.insert(std::make_pair(s->m_GameCode, std::deque<Session*>()));

p.first->second.push_back(s);

唯一的低效率是当元素已经存在时,在这种情况下你必须扔掉一个 empty deque。但是小的、短暂的堆分配通常并不昂贵,因此您应该仔细分析以证明更复杂的代码是合理的。想想你的继任者需要多长时间来完成和调试你的代码!

于 2012-05-19T18:26:17.130 回答
1

是的,它是安全的。即使 a与 aconst_iterator不同iterator,映射中的对象也是相同的。只要将所有地图内容创建为可变std::deque<Session*>对象,就可以将 constness 丢弃。

当然,您可能违反了 constness 旨在传达的一些不变量,但如果const_cast孤立地考虑,这是可能的。

于 2012-05-21T13:47:02.190 回答