C++의 STL 맵에 새 요소 삽입

Jinku Hu 2023년10월12일
  1. insert멤버 함수를 사용하여 C++의std::map에 새 요소 추가
  2. insert_or_assign멤버 함수를 사용하여 C++의std::map에 새 요소 추가
  3. emplace멤버 함수를 사용하여 C++의std::map에 새 요소 추가
  4. emplace_hint멤버 함수를 사용하여 C++의std::map에 새 요소 추가
C++의 STL 맵에 새 요소 삽입

이 기사에서는 C++의std::map객체에 새 요소를 추가하는 방법에 대한 여러 방법을 설명합니다.

insert멤버 함수를 사용하여 C++의std::map에 새 요소 추가

STL map컨테이너는 삽입 또는 초기화시 자동으로 정렬 된 키-값 쌍을 요소로 저장하기위한 데이터 구조를 제공합니다. 여러 메소드를 사용하여std::map객체에 새 요소를 추가 할 수 있습니다. 가장 일반적인 방법은insert함수입니다.

insert멤버 함수에 여러 오버로드가 있습니다. 여전히 가장 간단한 것은 삽입 된 객체에 대한const참조를 지정하는 단일 인수 만 사용합니다. 다른 오버로드는 r- 값 참조를 허용하고std::forward명령을 사용하여 다음 샘플 코드에 표시된 것처럼 요소를 제자리에서 구성 할 수 있습니다.

후자의 오버로드는 삽입 된 요소와bool값에 대한 반복기 쌍을 반환하여 성공적인 삽입을 나타냅니다. 또한 이니셜 라이저 목록과 유사한 키-값 목록을 가져와 값에서 요소를 구성하는insert함수의 오버로드를 보여줍니다. 그러나이 오버로드에는 반환 형식이 없습니다.

#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
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::map<string, string> m1 = {
      {"h", "htop"},
      {"k", "ktop"},
  };

  auto ret = m1.insert({"k", "ktop"});
  ret.second ? cout << "Inserted" : cout << "Not Inserted";
  cout << "\n";

  m1.insert({{"k", "ktop"}, {"p", "ptop"}});
  printMap(m1);

  return EXIT_SUCCESS;
}

출력:

Not Inserted
h : htop;
k : ktop;
p : ptop;

insert_or_assign멤버 함수를 사용하여 C++의std::map에 새 요소 추가

최신 C++ 17 표준은insert_or_assign이라는 멤버 함수를 제공합니다.이 함수는 지정된 키가 아직없는 경우 맵에 새 요소를 삽입합니다. 그렇지 않으면 함수는 기존 키가있는 요소에 새 값을 할당합니다.

이 함수에는 여러 오버로드가 있지만 다음 예제에서 호출되는 함수는 키와 값에 대한 r- 값 참조로 두 개의 인수를 사용합니다. 이 오버로드는 또한 한 쌍의 반복자와bool값을 반환합니다. 조건부 연산자로 삽입 상태를 확인하고 해당 메시지를 인쇄합니다.

#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
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::map<string, string> m1 = {
      {"h", "htop"},
      {"k", "ktop"},
  };

  auto ret = m1.insert_or_assign("p", "ptop");
  ret.second ? cout << "Inserted" : cout << "Assigned";
  cout << "\n";

  ret = m1.insert_or_assign("t", "ttop");
  ret.second ? cout << "Inserted" : cout << "Assigned";
  cout << "\n";

  printMap(m1);

  return EXIT_SUCCESS;
}

출력:

Inserted
Inserted
h : htop;
k : ktop;
p : ptop;
t : ttop;

emplace멤버 함수를 사용하여 C++의std::map에 새 요소 추가

std::map컨테이너와 함께 제공되는 또 다른 멤버 함수는emplace입니다. 이 함수는 인수 값을 복사 할 필요가 없기 때문에insert함수와 달리 효율성을 제공합니다. 반대로emplace함수는 요소를 제자리에서 생성합니다. 즉, 지정된 매개 변수가 클래스 생성자에 전달됩니다. 인수에 따라 해당 생성자가 호출됩니다.

#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
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::map<string, string> m1 = {
      {"h", "htop"},
      {"k", "ktop"},
  };

  auto ret = m1.emplace("t", "ttop");
  ret.second ? cout << "Inserted" : cout << "Not Inserted";
  cout << endl;

  ret = m1.emplace(std::make_pair("t", "ttop"));
  ret.second ? cout << "Inserted" : cout << "Not Inserted";
  cout << endl;

  printMap(m1);

  return EXIT_SUCCESS;
}

출력:

Inserted
Not Inserted
h : htop;
k : ktop;
t : ttop;

emplace_hint멤버 함수를 사용하여 C++의std::map에 새 요소 추가

또는emplace_hint멤버 함수를 사용하여hint라는 추가 매개 변수를 사용하여 새 요소를 맵에 삽입 할 수 있습니다. 이는 오퍼레이션이 검색을 시작해야하는 위치를 지정합니다. 프로세스가 성공하면 새로 삽입 된 요소에 반복자를 반환합니다. 그렇지 않으면 동일한 키를 가진 기존 요소에 대한 반복기가 리턴됩니다.

#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
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::map<string, string> m1 = {
      {"h", "htop"},
      {"k", "ktop"},
  };

  auto ret = m1.emplace_hint(m1.begin(), "t", "ttop");

  m1.emplace_hint(ret, "m", "mtop");
  m1.emplace_hint(m1.begin(), "p", "ptop");

  printMap(m1);

  return EXIT_SUCCESS;
}

출력:

h : htop;
k : ktop;
m : mtop;
p : ptop;
t : ttop;
작가: 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