C++에서 STL 무순 맵 컨테이너 사용

Jinku Hu 2023년10월12일
  1. std::unordered_map요소를 사용하여 C++에서 정렬되지 않은 맵 컨테이너 선언
  2. contains멤버 함수를 사용하여 주어진 요소가 C++의 맵에 존재하는지 확인
  3. erase멤버 함수를 사용하여 C++의 맵에서 특정 요소 제거
  4. 삽입멤버 함수를 사용하여 C++에서 맵에 새 요소 추가
C++에서 STL 무순 맵 컨테이너 사용

이 기사에서는 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;
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

관련 문장 - C++ Map