begin(), end() method
// map::begin/end
#include <iostream>
#include <map>
int main ()
{
std::map<char,int> mymap;
mymap['b'] = 100;
mymap['a'] = 200;
mymap['c'] = 300;
// show content:
for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it)
std::cout << it->first << " => " << it->second << '\n';
std::cout<<mymap.end()->first<< " => " << mymap.end()->second<< '\n';
return 0;
}
- 위와 같이 접근시에는 iterator를 이용해 접근함.
- 주의할 점은, iterator의 시작과 끝은 begin() 과 end() 메소드를 통해 그 값을 가져올 수 있는데, begin의 경우 map의 가장 첫번째 아이템을 가져오는 것과 달리, end() method의 경우에는 원소의 값이 없으므로, 접근해서 사용하면 원하는 값이 나오지 않을 것이다.
- 다만, 해당 메소드는
lower_bound(x_key)
와 같은 메소드를 이용할 때, 만약 iterator가 해당 값과 동일하다면 containor에 있는 값들은 모조리 현재 x_key
값보다 key 값이 더 작다는 것을 알 수 있게 해준다.
//출처 : 종만북 707p
map<int, int> coords;
bool isDominated(int x, int y){
map<int, int>:: iterator it = coords.lower_bound(x);
if(it==coords.end())return false;
return it->second > y;
}
- 위와 같이 iterator 값을
lower_bound(x)
메소드를 이용해 비교 하는 경우, end()
메소드는 좋은 코너 케이스가 될 수 있을 것이다.
upper_bound(), lower_bound() 메소드
- upper_bound()와 lower_bound()는 이름에서 유추가 힘들다. 둘 다 기준 값보다 작지 않은 값 중 경계값을 찾는데 의의가 있다.
- 다만, upper_bound()는 기준 값과 같은 값을 포함하지 않고, lower_bound() 는 기준값과 같은 값을 포함한다.
map<int, int> A;
A[1]=1;
A[2]=2;
A[3]=3;
map<int, int>::iterator upit = A.upper_bound(2);
map<int, int>::iterator loit = A.lower_bound(2);
- 결과값은, upit는 3을 가리키는(
upit->first == 3
, upit->second == 3
) iterator가 되고, loit의 경우 동일한 index 를 사용했지만, 2를 가리키는(loit->first==2
, loit->second == 2
) iterator가 된다.