C++의 STL 맵에 새 요소 삽입
-
insert
멤버 함수를 사용하여 C++의std::map
에 새 요소 추가 -
insert_or_assign
멤버 함수를 사용하여 C++의std::map
에 새 요소 추가 -
emplace
멤버 함수를 사용하여 C++의std::map
에 새 요소 추가 -
emplace_hint
멤버 함수를 사용하여 C++의std::map
에 새 요소 추가
이 기사에서는 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;
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