2012-05-19 2 views
0

이 코드가 안전하고 정의되지 않은 동작이 없는지 알고 싶습니다.const_cast (iterator-> second)는 안전한가요?

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*> > 

답변

1

예, 안전합니다. const_iteratoriterator과 다른 경우에도지도의 개체는 동일합니다. 모든지도 내용이 변경 가능한 std::deque<Session*> 개체로 생성 된 한, constness 멀리 던져도 괜찮습니다.

당연히 constrict가 전달하려고하는 일부 불변성을 위반하는 것이 가능할 수도 있지만, 이는 const_cast을 단독으로 사용할 때 가능합니다.

4

코드와의 모순이 있습니다. QueueMap::const_iterator 대신 QueueMap::iterator을 사용하면됩니다.

명시 적으로 const로 지정하면 이 발생하여 const이 발생하지 않습니다. 왜 귀찮아?

+0

m_3playersQueeu가 const 인 경우,'find'는'const_iterator'를 리턴합니다. – Chris

+0

나는 그것에 대해 알고있다. 나는 단순히 const_iterator를 반복자로 변경할 수 있다는 것을 알고있다. 그러나 그 코드는 재미있었습니다. const_iterator는 반복기보다 조금 빠릅니다. 이유는 무엇입니까? – Zaffy

+7

@quarry : 조기에 최적화 할 수있는 것 같습니다. –

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. 그러나 작고 수명이 짧은 힙 할당은 일반적으로 비싸지 않으므로 더 복잡한 코드를 정당화하기 위해주의 깊게 프로파일해야합니다. 후임이 코드를 작성하고 디버깅하는 데 얼마나 걸릴지 생각하십시오!

관련 문제