산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

C++ std::map 완전 정복: 정렬된 키-값 컨테이너 실전 가이드

std::map이란?

C++ 표준 템플릿 라이브러리(STL)에서 std::map은 요소를 키-값 쌍으로 저장하는 연관 컨테이너입니다. 각 키는 고유하며 컨테이너는 키의 비교 함수(기본적으로 std::less)에 따라 요소를 자동으로 정렬된 상태로 유지합니다. 값은 어떤 타입이든 될 수 있으며 해당 키를 통해 접근합니다.

왜 std::map을 사용하는가?

문법

다음과 같이 map 선언:

std::map<KeyType, ValueType> mapName;

예제:

std::map<std::string, int> ageMap;

멤버 타입

  • key_type: 키 타입
  • mapped_type: 매핑된 값 타입
  • value_type: std::pair<const key_type, mapped_type>
  • iterator: value_type에 대한 양방향 반복자
  • const_iterator, reverse_iterator, const_reverse_iterator
  • size_type, difference_type

내장 함수들

  • begin() – 첫 번째 요소로의 반복자
  • end() – 끝 다음 반복자
  • size() – 요소 수
  • empty() – map이 비었는지 여부
  • insert() – 키/값 쌍 추가
  • find() – 키로 요소 찾기
  • erase() – 반복자나 키로 요소 제거
  • clear() – 모든 요소 제거
  • count(), lower_bound() 같은 기타 유틸리티도 사용 가능

map 요소 순회

반복자들은 순회 순서에 대한 완전한 제어를 제공하며, 항상 키로 정렬됩니다.

#include <iostream>
#include <string>
#include <map>
using namespace std;
int main() {
    map<int, string> students;
    students.insert({200, "Alice"});
    students.insert({201, "John"});
    cout << "Map size is: " << students.size() << endl;
    cout << endl << "Default map order:" << endl;
    for (auto it = students.begin(); it != students.end(); ++it) {
        cout << it->first << ": " << it->second << endl;
    }
    return 0;
}

출력:

C++ std::map 완전 정복: 정렬된 키-값 컨테이너 실전 가이드

std::map에 데이터 삽입

새 항목에는 insert() 사용; 중복은 묵시적으로 거부. 기존 키를 덮어쓰려면 insert_or_assign() 사용.

#include <map>
#include <iostream>
using namespace std;
int main() {
    map<int, int> m{{1,3},{2,4},{3,5}};
    m.insert({5,6}); // 새 쌍 추가
    m.insert({1,8}); // 무시됨, 키 1 이미 존재
    m.insert_or_assign(1,6); // 키 1의 값을 6으로 업데이트
    cout << "Key\tElement\n";
    for (auto& p : m) {
        cout << p.first << '\t' << p.second << '\n';
    }
    return 0;
}

출력:

C++ std::map 완전 정복: 정렬된 키-값 컨테이너 실전 가이드

map에서 검색

find()로 키 찾기가 간단합니다. 키가 존재하면 반환된 반복자가 요소를 가리키고, 아니면 end() 반환.

#include <iostream>
#include <map>
using namespace std;
int main() {
    map<int, string> students;
    students.insert({200, "Alice"});
    students.insert({201, "John"});
    if (auto it = students.find(201); it != students.end()) {
        cout << "Key 201 has value: " << it->second << endl;
    }
    return 0;
}

출력:

C++ std::map 완전 정복: 정렬된 키-값 컨테이너 실전 가이드

map에서 데이터 삭제

요소는 키나 반복자로 제거 가능. erase() 메서드는 지워진 요소를 가리키는 반복자만 무효화.

#include <iostream>
#include <map>
using namespace std;
int main() {
    map<string, int> myMap;
    myMap["cow"] = 1;
    myMap["cat"] = 2;
    myMap["lion"] = 3;
    if (auto it = myMap.find("cat"); it != myMap.end()) {
        myMap.erase(it);
    }
    for (auto& p : myMap) {
        cout << p.first << ": " << p.second << endl;
    }
    return 0;
}

출력:

C++ std::map 완전 정복: 정렬된 키-값 컨테이너 실전 가이드

요약

  • std::map은 고유 키를 가진 정렬된 연관 컨테이너입니다.
  • 키는 효율적인 조회를 제공; 값은 연관된 데이터를 보유
  • 내부 레드-블랙 트리로 인해 모든 핵심 연산이 로그 시간 실행
  • 이터레이터로 순회, 삽입, 삭제, 범위 쿼리 가능
  • insert_or_assign()으로 값 업데이트 간편
  • 존재 확인과 직접 접근에 find() 사용
  • 삭제 연산은 개별 요소 또는 전체 map 정리 가능

C 언어

  1. C 표준 라이브러리 함수 마스터하기: 실전 가이드
  2. C++ 연산자 총정리: 종류, 예제, 샘플 프로그램
  3. C++ do-while 루프: 문법, 실전 예제, 중첩 루프
  4. C++ switch-case 마스터하기: 문법, 활용법, 실전 예제
  5. C++ 동적 배열 할당 완벽 가이드: new, delete, 실전 코드 예제
  6. C++ 포인터 완전 정복: 개념, 예제, 실전 활용
  7. C++ 연산자 오버로딩 실전 가이드: 문법, 접근법, 코드 예제
  8. C++ std::list 마스터하기: 문법, 함수, 실전 예제
  9. C++ 함수 완전 정복: 실전 코드 예제로 이해하기
  10. C++ 구조체 vs 클래스: 핵심 차이, 문법, 최적 사용 사례