Code: Select all
#include <iostream>
#include <map>
struct TestData
{
int nA;
std::string strB;
int nC;
};
void main()
{
TestData data;
data.nA = 10;
data.strB = "가나다1";
data.nC = 20;
std::map<int,TestData〉 mapData;
mapData[10] = data;
mapData[20] = data;
mapData[30] = data;
mapData[40] = data;
mapData[10].strB = "가나다1";
mapData[20].strB = "가나다2";
mapData[30].strB = "가나다3";
mapData[40].strB = "가나다4";
for each( const std::pair<int,TestData〉 pr in mapData ) // ok
{
std::cout << pr.second.nA << " "
<< pr.second.strB.c_str() << " "
<< pr.second.nC << std::endl;
}
for each( const std::pair<int,TestData〉& pr in mapData ) // error
{
std::cout << pr.second.nA << " "
<< pr.second.strB.c_str() << " "
<< pr.second.nC << std::endl;
}
}
간단하게 데이터만 묶어둔 구조체 같은 경우는 저렇게 직접 객체 자체를 넣기도 하는데,
- 1. std::map 컨테이너에
2. 포인터가 아닌 실제 객체를 넣는 경우
3. reference 형태로 for each 루프를 돌게 되면
위 코드의 결과는 아래와 같습니다.
TestData 구조체에 복사생성자, 소멸자를 정의해놓고 BreakPoint를 찍어보면10 가나다1 20
10 가나다2 20
10 가나다3 20
10 가나다4 20
10 20
10 20
10 20
10 20
계속하려면 아무 키나 누르십시오 . . .
오작동하는 loop의 경우에도 std::pair<...>가 계속 복사되는 걸 확인할 수 있는데
왜 그렇게 되는지를 영 모르겠습니다 *~*
원인을 설명해주실 수 있는 분 계신가요.
답변 부탁드립니다.
ps. 위 소스코드에서 템플릿 닫는 괄호 ( > )가 다른걸로 인식되는지 자꾸 사라지길래 다른 기호 ( 〉 )로 바꾸어 적었습니다. 복사해서 테스트 하시려면 이부분 고쳐 주세요 ^^;