C++/STL

[C++ Container] map/unordered_map. at, []. element access 차이

sseram 2023. 2. 24. 22:45
반응형

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