Showing posts with label map. Show all posts
Showing posts with label map. Show all posts

2009/09/27

map 에서의 원소 추가 및 접근 ( insert, find, operator[] )

stl 의 컨테이너 중 하나인 map 에는 원소의 추가와 접근 할 때 operator 에 의한 방법과 함수에 의한 방법이 있다.

이 두 가지 방법에는 차이가 있다.



존재하지 않는 키에 대한 접근이 일어날 경우 operator[]는 빈 객체를 만들어 생성여 반환을 하고 find 함수는 맵의 마지막 포인터를 반환한다.

operator[] 에 의한 키의 접근시 존재가 확실하지 않는 경우라면 예기치 않은 원소를 만들 수 있다.

std::map< int, std::string > alias;
// alias [0]()

// operator[]에 의한 데이터 추가
alias[ 1 ] = "cat";
// alias [1]((1,"cat"))
alias[ 2 ] = "dog";
// alias [2]((1,"cat"),(2,"dog"))

// insert 함수에 의한 추가
alias.insert( make_pair( 3, "bird" ) );
// alias [3]((1,"cat"),(2,"dog"),(3,"bird"))
alias.insert( make_pair( 4, "flog" ) );
// alias [4]((1,"cat"),(2,"dog"),(3,"bird"),(4,"flog"))

// operator[]에 의한 데이터 접근
std::string animal;
animal = alias[ 3 ];
// animal "bird"

animal = alias[ 5 ];
// alias [5]((1,"cat"),(2,"dog"),(3,"bird"),(4,"flog"),(5,""))
// animal ""

// find 함수에 의한 접근
std::map< int, std::string >::iterator itFind = alias.find( 2 );
// itFind (2,"dog")
if ( itFind != alias.end() )
{
animal = itFind->second;
// animal "dog"
}

itFind = alias.find( 6 );
// itFind (-842150451,<Bad Ptr>)
// alias [5]((1,"cat"),(2,"dog"),(3,"bird"),(4,"flog"),(5,""))
if ( itFind != alias.end() )
{
animal = itFind->second;
}


Original Post : http://neodreamer-dev.tistory.com/328

2009/02/23

[STL] map 의 맨 마지막 원소에 접근하기 (map.end() 는 마지막 원소가 아니다!!)

vector 나 list의 경우 크기를 가져와 마지막 원소에 쉽게 접근 할 수 있지만 map의 경우 Key 에 의해 접근으로 find() 멤버함수를 이용하여 iterator를 가져와서 접근할 수 있다.

그러면 맨 마지막 값을 가져오기 위해서는 맨 마지막 iterator를 가져오기만 하면 되는데...
map 의 member 함수 중 end() 함수가 있는데 이는 맨 마지막 iterator를 가리키기 않는다. end() 함수는 맨마지막 원소를 넘어선 map의 가장 마지막을 가르킨다. 그래서 end() 함수를 활용하여 맨 마지막 원소에 접근하려면 증감연산자(--)를 이용해 한단계 앞으로 iterator를 옮겨 주면 된다. 그리고 map 에는 rbegin() 이라는 함수도 제공하는데 이는 현재 map에 있는 원소를 거꾸로 하였을때 맨 처음 원소를 가리킨다.


map< int, Data* > mpData;

// end() 의한 마지만 원소 접근
map< int, Data* >::iterator it = --mpData.end();
Data* pData = it->second;

// rbegin() 에 의한 마지막 원소 접근
map< int, Data* >::reverse_iterator it = mpData.rbegin();
Data* pData = it->second;



위의 코드중 end() 함수에 의한 접근은 위험 요소를 갖고 있다. map에 저장된 데이터가 하나도 없을 경우 에러를 발생한다. end()에 의한 접근 전에 map의 크기를 검사 하는 루틴을 포함해 주어야한다.


Original Post : http://neodreamer-dev.tistory.com/257