C++에서 STL 무순 맵 컨테이너 사용
-
std::unordered_map
요소를 사용하여 C++에서 정렬되지 않은 맵 컨테이너 선언 -
contains
멤버 함수를 사용하여 주어진 요소가 C++의 맵에 존재하는지 확인 -
erase
멤버 함수를 사용하여 C++의 맵에서 특정 요소 제거 -
삽입
멤버 함수를 사용하여 C++에서 맵에 새 요소 추가
이 기사에서는 C++에서 STL unordered_map
컨테이너를 사용하는 방법에 대한 몇 가지 방법을 설명합니다.
std::unordered_map
요소를 사용하여 C++에서 정렬되지 않은 맵 컨테이너 선언
std::unordered_map
요소는 각 키가 고유 한 키-값 쌍의 연관 컨테이너를 구현합니다. std::map
과 달리std::unordered_map
컨테이너는 정렬 된 순서로 요소를 저장하지 않습니다. 따라서 컨테이너는 주로 요소 조회에 사용되며 위치는 중요하지 않습니다. 더욱이, 객체의 수명 동안 요소의 위치는 고정되어 있다고 보장 할 수 없습니다. 따라서 프로그래머는 순서를 정의되지 않은 것으로 처리해야합니다.
다음 예제는unordered_map
컨테이너의 목록 초기화를 보여준 다음 두 맵의 내용을 출력합니다. m1
요소의 내림차순이 해당 요소가 정렬되었음을 의미하지는 않습니다.
#include <iostream>
#include <map>
#include <unordered_map>
using std::cout;
using std::endl;
using std::string;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::unordered_map<int, string> m1 = {
{1, "apple"},
{2, "banana"},
{3, "grape"},
{4, "orange"},
};
std::map<int, string> m2 = {
{1, "apple"},
{2, "banana"},
{3, "grape"},
{4, "orange"},
};
printMap(m1);
printMap(m2);
return EXIT_SUCCESS;
}
출력:
4 : orange;
3 : grape;
2 : banana;
1 : apple;
1 : apple;
2 : banana;
3 : grape;
4 : orange;
contains
멤버 함수를 사용하여 주어진 요소가 C++의 맵에 존재하는지 확인
contains
멤버 함수는 C++ 20 업데이트 이후std::unordered_map
컨테이너의 일부였습니다. 함수를 사용하여 지정된 요소가지도에 있는지 확인할 수 있습니다. 이 명령은 키-값을 유일한 인수로 받아들이고 키가 발견되면true
를 반환합니다. 이 함수는 평균 실행 시간이 일정하며 최악의 경우 컨테이너 자체의 크기에 따라 선형이됩니다.
#include <iostream>
#include <map>
#include <unordered_map>
using std::cout;
using std::endl;
using std::string;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::unordered_map<int, string> m1 = {
{1, "apple"},
{2, "banana"},
{3, "grape"},
{4, "orange"},
};
for (int x : {1, 2, 3, 4, 5}) {
if (m1.contains(x)) {
cout << x << ": Found\n";
} else {
cout << x << ": Not found\n";
}
}
return EXIT_SUCCESS;
}
출력:
1: Found
2: Found
3: Found
4: Found
5: Not found
erase
멤버 함수를 사용하여 C++의 맵에서 특정 요소 제거
erase
멤버 함수를 사용하여 맵에서 지정된 키-값 쌍을 제거 할 수 있습니다. 이 함수에는 세 개의 오버로드가 있으며, 그중 첫 번째 오버로드는 컨테이너에서 제거해야하는 맵 요소로 이터레이터를 가져옵니다. 두 번째 함수 오버로드는 범위를 지정하기 위해 두 개의 반복자를 사용하며, 이는 맵에서 제거됩니다. 지정된 범위는 호출 컨테이너 개체 내에서 유효한 범위 여야합니다. 세 번째 오버로드는 제거해야하는 요소의 키 값을 사용할 수 있습니다.
다음 예에서는 키 값이 짝수 인 각 요소를 제거합니다.
#include <iostream>
#include <map>
#include <unordered_map>
using std::cout;
using std::endl;
using std::string;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::unordered_map<int, string> m1 = {
{1, "apple"},
{2, "banana"},
{3, "grape"},
{4, "orange"},
};
for (auto it = m1.begin(); it != m1.end();) {
if (it->first % 2 == 0)
it = m1.erase(it);
else
++it;
}
printMap(m1);
return EXIT_SUCCESS;
}
출력:
3 : grape;
1 : apple;
삽입
멤버 함수를 사용하여 C++에서 맵에 새 요소 추가
unordered_map
컨테이너의 또 다른 핵심 멤버 함수는insert
함수로, 맵에 새 요소를 추가하는 데 사용할 수 있습니다. 이 함수에는 여러 오버로드가 있지만 키-값 쌍만 취하는 첫 번째 오버로드를 사용합니다. 또한std::make_pair
함수를 사용하여 주어진 인수 값으로 새 쌍을 생성합니다.
#include <iostream>
#include <map>
#include <unordered_map>
#include <vector>
using std::cout;
using std::endl;
using std::string;
using std::vector;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::unordered_map<int, string> m1 = {
{1, "apple"},
{2, "banana"},
{3, "grape"},
{4, "orange"},
};
vector<string> vec{"papaya", "olive", "melon"};
auto count = 0;
for (const auto& item : vec) {
m1.insert(std::make_pair(count, item));
}
printMap(m1);
return EXIT_SUCCESS;
}
출력:
0 : papaya;
4 : orange;
3 : grape;
2 : banana;
1 : apple;
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook