2012-03-05 2 views
0

처음C++ 맵을 통한 반복의 차이점

나는 Draw 함수가 포함 된 Node 클래스가 있습니다. 노드는 다음과 같은 맵에 포함됩니다.

map<std::string, Node*> 

반복자를 사용하여 맵의 모든 노드를 그릴 때 아무 일도 발생하지 않습니다. gc는 그리기 기능에 전달하는 그래픽 컨텍스트입니다.

std::map<std::string, Node*>::const_iterator itr = _Nodes.begin(); 
while(itr != _Nodes.end()) 
{ 
    itr->second->setX(100); 
} 

하지만 작동하지 않습니다. 그러나 iterator를 다르게 구성하면 작동합니다.

std::map<std::string, Node*>::const_iterator end = _Nodes.end(); 
for(std::map<std::string, Node*>::const_iterator it = _Nodes.begin(); it != end; ++it){ 
    it->second->draw(gc); 
    it->second->setSize(100); 
} 

제 질문은 왜 다른 하나는 작동합니까?

두 번째 질문은 이름을 지정하지 않고 NodeManager 클래스에 모든 노드를 저장하는 대체 방법은 무엇입니까? 그냥 간단한 목록?

+3

당신은 draw''호출되지 않습니다.그것은 오타 또는 실제 오류입니까? – Naveen

+2

밑줄 - 대문자는 예약되어 있으므로 사용하지 마십시오. 사용하는 것은 정의되지 않은 동작입니다. –

답변

5

첫 번째 루프에서는 ++itr을 호출하지 않습니다. 반복자는 결코 바뀌지 않을 것입니다.

가되어야한다

std::map<std::string, Node*>::const_iterator itr = _Nodes.begin(); 
while(itr != _Nodes.end()) 
{ 
    itr->second->setX(100); 
    ++itr; 
} 

PS : 당신이 C++ (11)를 사용할 수있는 경우이 훨씬 더 편리합니다 :

auto itr = _Nodes.begin(); 

PPS : _Node이 금지 된 이름입니다. 밑줄 + 자본으로 시작하는 이름은 표준에 의해 예약됩니다.

PPPS : 첫 번째 예에서는 proably 성능 (그러나 약간) 약간을 저장하는 변수에 end()를 저장할.

4

->하지만이 작동하지 않습니다.

1 버전 (while 루프), 2 차 버전 (for 루프) 사이에 큰 차이가 있기 때문에

.

  1. while() 당신이 전화 while()에서 반복자
  2. 을 증가시키기위한 어떤 it++이없는 경우에만 setX()

->은에있는 모든 노드를 저장하는 또 다른 방법 일 것입니다 무슨 이름을 지정하지 않고도 NodeManager 클래스를 사용할 수 있습니까? 단순히 배열을

  • std::set을하려는 경우 Node*
  • 에 따라 노드를 찾을 수 있도록하려면

    1. std::vector (또는 등가물), 당신이 찾고있는 수 있음 첫 번째`while` 루프에서
    +0

    99 %의 확률로 그는'vector' /'set'을 원하지만'deque'를 잊지 마세요! ('list'를 잊어 버려주세요 ...) –