我想知道这段代码是否安全,并且没有任何未定义的行为。
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*> >
答案 0 :(得分:4)
你的代码与自己相矛盾。只需使用QueueMap::iterator
代替QueueMap::const_iterator
。
你正在做的是明确地将其设为const,然后const_cast
离开const
ness。为什么要这么麻烦?
答案 1 :(得分: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);
唯一的低效率是当元素已经存在时,在这种情况下你必须抛弃一个空的deque
。但是,小的,短暂的堆分配通常并不昂贵,因此您应该仔细分析以证明更复杂的代码。想想你的继任者需要多长时间来完成和调试你的代码!
答案 2 :(得分:1)
是的,这是安全的。即使const_iterator
与iterator
不同,地图中的对象也是相同的。只要所有地图内容都被创建为可变std::deque<Session*>
个对象,就可以将常量转换为。
当然,你可能违反了constness所要传达的一些不变量,但是任何const_cast
孤立的都可以这样做。