#include <map>
int main()
{
std::map<std::string, int> simpleScoreMap;
--> 추가 방법 1
simpleScoreMap.insert(std::pair<std::string, int>("Mocha", 100));
simpleScoreMap.insert(std::pair<std::string, int>("Coco", 50));
--> 추가 방법 2
simpleScoreMap["Mocha"] = 0; <-- 대입 하는 문법만으로도 추가 가능.
int data = simpleScoreMap["Coco"]; <-- 이렇게 읽기만 하더라도 추가
std::cout << "Current Size : " << simpleScoreMap.size() << std::endl;
}
std::pair<std::string, int> student1("Coco", 10);
//pair.first;
//pairs.second;
simpleScoreMap.insert(std::pair<std::string, int>("Mocha", 100));
simpleScoreMap.insert(std::pari<std::string, int>("Mocha", 100));
// <iterator, tru> 를 반환한다.
simpleScoreMap.insert(std::pari<std::string, int>("Mocha", 0));// 중복 삽입
// <iterator, false>를 반환한다.
// 삽입 실패
std::map<std::string, int> simpleScoreMap;
simpleScoreMap["Coco"] = 10;// 새 요소를 삽입한다.
simpleScoreMap["Coco"] = 50;// "Coco"의 값을 덮어 쓴다.
// 값이 중복 되어 있는지 확인할 수 없다,,, find 함수로 찾아야 함.
return simpleScoreMap["Coco"];
// "만약 Coco가 없으면 기본값을 삽입해서 반환해 주기에 실수 할 수 있다."
simpleScoreMap.insert(std::pair<std::string, int>("Mocha", 100));
simpleScoreMap.insert(std::pair<std::string, int>("Coco", 50));
for(std::map<std::string, int>::iterator it = simpleScoreMap.begin(); it != simpleScoreMap.end(); ++it)
{
std::cout << "(" << it->first <<", " << it->second << ")" << std::endl;
}
// "map은 vector처럼 순서가 없으니 key에 따라 정렬이 된다."
// OUTPUT>>
// "Coco", 50
// "Mocha", 100
#include <map>
int main()
{
std::map<std::string, int> simpleScoreMap;
simpleScoreMap.insert(std::pair<std::string, int>("Mocha", 100));
// 찾음
std::map<std::string, int>::iterator it = simpleScoreMap.find("Mocha");
if(it != simpleScoreMap.end())
{
it->second = 80;
}
}
std::map<std::string, int>::iterator it = simpleScoreMap.find("Mocha");
std::map<std::string, int> scoreMap;// ["Mocha", 10], ["Coco", 40]
std::map<std::string, int> anotherScoreMap;// ["Nana", 100]
scoreMap.swap( anotherScoreMap)
// scoreMap : ["Nana", 100]
// anotherScoreMap : ["Mocha", 10], ["Coco", 40]
anotherScoreMap.clear()
map의 요소들을 제거한다.
삭제 방법 1
std::map<std::string, int>::iterator foundIt = simpleScoreMap.find("Coco");
simpleScoreMap.erase(foundIt);
simpleScoreMap.erase("Coco");
// 좀더 편하고 일반적인 방식
EX) 개체를 키로 사용하기
class StudentInfo
{
public:
private:
std::string mName;
std::string mStudentID
}
int main()
{
std::map<StudentInfo, int> scores;
scores.insert(std::pair<StudentInfo, int>(StudentInfo("Poppy", "a556"), 30));
scores.insert(std::pair<StudentInfo, int>(StudentInfo("Lulu", "a112"), 70));
std::cout << scores[StudentInfo("Poppy", "a556")] << std::endl;
}
위의 코드가 잘 동작 할 까??
StudentInfo 클래스의 '<' 연산자 오버로딩을 해주면 된다.
bool StudentInfo::operator<(const StudentInfo& other) const
{
if(mName == other.mName)
{
return mStudentID < other.mStudentID;
}
return mName < other.mName;
}
struct StudentInfoComparer
{
bool operator()(const StudentInfo& left, const StudentInfo& right) const
{
return (left.getName() < right.getName());
}
}
std::map<StudentInfo, int, StudentInfoComparer> Scores;
// operator< 를 구현하는게 더 좋지만 이 방법을 사용 못하는 경우도 있다.
// 만약 StudentInfo가 남이 만든 Code이거나 수정 할 수 없을 때는 이 방법이 유용할 수 있다.
"Set은 map 과 거의 같다"
역시 정렬되는 컨테이너
"중복되지 않는 키를 요소로 저장함"
역시 이진 탐색 트리 기반
장점과 단점도 map과 같음
#include <set>
int main()
{
std::set<int> scores;
scores.insert(10);
scores.insert(20);
for(std::set<int>::iterator it = scores.begin(); it != scores.end(); ++it)
{
std::cout << *it << std::endl;
}
return 0;
}