반응형
C++11 ~
빠른 결론 :
없었던 것을 access할 때
[] -> 빈 값으로 세팅한다.
at -> out_of_range exception을 throw 한다.
나머지 부분은 전부 동일.
map / unordered_map 에서 key를 통해 값을 가져오는 두 가지의 방법.
map.at(KEY)
map[KEY]
#include <iostream>
#include <unordered_map>
#include <map>
using namespace std;
int main() {
map<string, string> colorCode {
{"red", "FF0000"},
{"green", "00FF00"},
{"blue", "0000FF"},
};
cout << colorCode["red"] << endl;
cout << colorCode.at("red") << endl;
return 0;
}
이런 식으로 간단하게 값을 가져올 수 있고,
#include <iostream>
#include <unordered_map>
#include <map>
using namespace std;
int main() {
map<string, string> colorCode {
{"red", "FF0000"},
{"green", "00FF00"},
{"blue", "0000FF"},
};
colorCode["green"] = "newcode1";
colorCode.at("blue") = "newcode2";
cout << colorCode.at("green") << endl;
cout << colorCode["blue"] << endl;
return 0;
}
이런 식으로, 해당 key에 원하는 값을 넣을 수도 있다.
만약 없는 값으로 value를 찾게 되면
int main() {
map<string, string> colorCode {
{"red", "FF0000"},
{"green", "00FF00"},
{"blue", "0000FF"},
};
cout << colorCode["no"] << endl;
return 0;
}
아무것도 안나오게 된다.
저 상황에서는 colorCode 라는 map에 "no" 라는 key는 없으므로, 해당 맵에 {"no", string()} 를 insert 하게 된다.
만약 at으로 검색하면?
int main() {
map<string, string> colorCode {
{"red", "FF0000"},
{"green", "00FF00"},
{"blue", "0000FF"},
};
cout << colorCode.at("no") << endl;
return 0;
}
이렇게 죽게 된다.
int main() {
map<string, string> colorCode {
{"red", "FF0000"},
{"green", "00FF00"},
{"blue", "0000FF"},
};
try {
cout << colorCode.at("no") << endl;
} catch (exception& e) {
cout << e.what() << endl;
}
return 0;
}
뭐땜시 죽었나 이런 식으로 확인해 보면, 부정확한 key를 사용했다고 친절하게 알려준다.
안전을 위해 at으로 사용을 하던가..
find / count를 통해 key가 있는지 없는지를 확인하고 [] 를 사용하도록 하자
반응형
'C++ > STL' 카테고리의 다른 글
[C++] std::async, std::thread (1) (0) | 2023.04.09 |
---|---|
[C++17] std::filesystem::path (0) | 2023.04.04 |
[C++17 ] FOLD Expression (0) | 2023.03.29 |
[C++ String] raw String (0) | 2023.02.27 |
[C++ Container] vector push_back vs emplace_back (0) | 2023.02.22 |