1. key와 value를 하나의 쌍으로 취급하는 원소를 관리하는 컨테이너
제공된 정렬 기준에 따라서 자신의 원소를 자동적으로 정렬하여 관리하게 된다. (key를 기반으로 정렬)
multimap은 중복허용 map 허용불가능
a) key/value쌍은 반드시 할당가능해야 하며 복사 가능해야한다.
b) key는 반드시 정렬 기준에 따라서 비교될 수 있어야 한다.
2. set과 multiset과의 차이점은 key/value의 존재이다. 또한 key에따라서 정렬되기 때문에 value에 의해서 검색을 한다면 나쁜 성능을 보인다. 원소의 key를 수정하기 위해서는 수정하고 싶은 key를 제거하고, 새로운 key와 예전의 value를 가지고 있는 새로운 원소를 삽입해야만 한다. 원소의 value를 직접 수정하는 것은 가능하다.
3. 정렬기준은 두 가지 방법
a) 템플릿 인자로 넣는 방식
std::map<float,std::string,std::greater<float>>coll;
b) 생성자의 인자로 넣는 방식
typedef std::map<std::string,float,std::greater<std::string>> StringFloatMap;
StringFloatMap coll;
4. 비교동작은 반드시 같은 타입이어야 한다.
5. 검색함수들
count(key) //원소의 갯수를 반환
find(key) // key값을 가지는 첫 번째의 원소를 반환한다.존재하지 않는다면 end()를 반환한다.
lower_bound(key) //key값보다 크거나 같은 값을 가지는 원소의 위치를 반환한다.
upper_bound(key) //key값보다 큰 값을 가지는 원소의 위치를 반환한다.
equal_range(key) //정렬된 상태를 깨트리지 않고 key가 삽입될 수 있는 첫 번째 위치와 마지막 위치를 반환한다.
6. 할당
c1 = c2
c1.swap(c2)
swap(c1,c2)
7. 반복자 함수들
c.begin(),c.end(),c.rbegin(),c.rend()
ex)
std::map<std::string,float>::iterator pos;
for(pos = coll.begin();pos != coll.end();++pos){
std:cout <<"key: "<<pos->first << "\t"
<<"value: " << pos->second << std::endl;
키를 변경하고 할때에는
std::map<std::string,float> coll;
MyLib::replace_key(coll,"old key","new key");
coll["new_key"] = coll["old_key"];
coll.erase("old_key");
8. 원소의 삽입과 제거
c.insert(elem) //삽입하고 원소의 위치를 반환한다. map의 경우 성공여부도 포함하여 반환한다.
c.insert(pos,elem) //삽입한고 원소의 위치를 반환한다 (pos는 힌트)
c.insert(beg,end) //범위의 모든원소들을 복사하여 삽입한다. 반환값은 없다.
c.erase(key) //key로 사용되는 모든 원소 제거
c.erase(pos) //pos위치의 원소를 제거
c.erase(beg,end) //범위의 모든 원소를 ㅔㅈ거
c.clear() //모든 원소를 제거
1. value_type 사용
- key/value쌍을 삽입하기 전에 사용자는 value_type를 사용하여 정확한 타입을 전달해야만 한다. value_type은 컨테이너 타입에서 타입정의로 제공된다. 예를 들어
std::map<std::string,float> coll;
coll.insert(std::map<std::string,float>::value_type("otto",22.3));
2. pair() 사용
std:map<std::string,float> coll;
coll.insert(std::pair<std::string,float>("otto",22.3));
coll.insert(std::pair<const std::string,float>("otto",22.3));
3. make_pair() 사용
std::map<std::string,float> coll;
coll.insert(std::make_pair("otto",22.3));
원소를 제거할 경우에는 무효화된 반복자를 사용하지 않도록 조심해야만 한다. 사실, 컨테이너의 반복자가 참조하고 있는 원소가 제거될 경우 아주 큰 위험성들이 있다.
typedef std::map<std::string,float> stringfloatmap;
stringfloatmap coll;
stringfloatmap::iterator pos;
for(pos = coll.begin();pos!=coll.end();++pos){
if(pos->second == value) {
coll.erase(pos); //런타임 에러!!
}
}
for(pos = coll.begin();pos!=coll.end();){
if(pos->second == value) {
coll.erase(pos++);
}else{
++pos;
}
}
9. map은 원소의 직접적인 인 액세스를 위한 [] 연산자를 제공한다.
m[key] //key를 가진 원소의 값을 레퍼런스로 반환 ,key가 존재하지 않는다면 key를 가진 원소를 삽입한다.
std::map<std::string,float> coll; //빈컨테이너
coll["otto"]= 7.7;
std::cout << coll["ottto"]; //key로 ottto를 가지는 새로운 원소를 삽입하고 나서 그 value를 출력한다. value는 0으로 초기화될 것이다.
ex)
typedef map<string,float> stringfloatmap;
stringfloatmap stocks; //빈 컨테이너 생성
//몇가지 원소를 삽입한다.
stocks["basf"] = 369.50;
stocks["vw"]= 413.50;
stocks["daimler"] = 819.00;
stocks["bmw"] = 834.00;
stocks["siemens"]= 842.20;
모든 원소를 출력한다.
stringfloatmap::iterator pos;
for(pos=stocks.begin();pos!=stocks.end();++pos)
{
cout <<"stock:"<<pos->first<<"\t"
<<"price:"<<pos->second<<endl;
}
//모든 가격을 2배로 조정한다.
for(pos=stocks.begin();pos!=stocks.end();++pos){
pos->second*=2;
}
//"vm"를 "volkswagen"으로 변경한다.
stocks["Volkswagen"] = stock["vm"];
stocks.erase("vm");
ex2)
typdef multimap<string,string> strstrmmap;
strstrmmap dict;
//몇가지 원소 삽입
dict.insert(make_pair("day","tag"));
dict.insert(make_pair("strange","fremd"));
dict.insert(make_pair("car","auto"));
dict.insert(make_pair("smart","elegant"));
dict.insert(make_pair("trait","merkmal"));
dict.insert(make_pair("strange","seltsam"));
dict.insert(make_pair("smart","raffiniert"));
dict.insert(make_pair("smart","klug"));
dict.insert(make_pair("clever","raffiniert"));
//모든 원소 출력
strstrmmap::iterator pos;
cout.setf(ios::left,ios::adjustfield);
cout<<' '<<setw(1)<<"english"
<<"germen" <<endl;
cout <<setfill('-')<<setw(20) <<""
<<setfill('-') <<endl;
for(pos = dict.begin();pos!=dict.end();++pos){
cout << ' '<,setw(10) << pos->first.c_str()
<<pos->second <<endl;
}
//key로 "smart"를 가진 원소의 value를 출력한다.
string word("smart");
for(pos = dict.lower_bound(word);
pos !=dict.upper_bound(word); ++pos) {
cout <<" "<<pos->second <<endl;
}
//value로 "raffiniert"을 가진 원소의 key를 출력한다.
word = ("raffiniert");
for(pos = dict.begin();
pos !=dict.end(); ++pos) {
if(pos->second == word){
cout <<" "<<pos->first <<endl;
}
}