지도 위치 C++ 표준 템플릿 라이브러리(STL)

⚡ 스마트 요약

지도 위치 C++ `<Template>`는 표준 템플릿 라이브러리(STL)의 연관 컨테이너로, 요소를 정렬된 키-값 쌍으로 저장합니다. 각 고유 키는 하나의 값에 매핑되어 빠른 조회, 삽입 및 정렬된 순회를 가능하게 합니다.

  • 🗺️ 연관 컨테이너: A C++ 맵은 항목을 고유하고 자동으로 정렬되는 키를 가진 키-값 쌍으로 저장합니다.
  • 🧩 헤더 및 구문: 맵 헤더를 포함시킨 다음 std::map을 선언합니다. 타입이 지정된 쌍을 저장할 이름입니다.
  • 🛠️ 내장 함수: begin(), size(), empty(), insert(), find(), erase(), clear() 함수는 맵의 내용을 관리합니다.
  • 🔄 반복: 양방향 반복자는 읽기 또는 삭제를 위해 정렬된 키 순서로 맵 요소를 순회합니다.
  • 🔑 고유 키: 두 요소는 동일한 키를 공유할 수 없으므로 맵은 연관 배열로 사용하기에 이상적입니다.
  • 🤖 AI 지원: GitHub Copilot과 같은 AI 도우미는 짧은 주석에서 맵 선언과 반복문을 구성합니다.

지도 위치 C++ STL

지도란 무엇인가요? C++?

In C++MAP은 매핑된 형태로 항목을 저장하는 연관 컨테이너입니다. 맵의 각 항목은 키 값과 매핑된 값으로 구성됩니다. 두 개의 매핑된 값은 동일한 키 값을 공유할 수 없습니다.

키 값은 요소를 정렬하고 고유하게 식별하는 데 유용하며, 매핑된 값은 각 키와 연결된 콘텐츠를 저장합니다. 두 값의 유형은 다를 수 있지만, 멤버 유형은 이 둘을 모두 포함하는 쌍으로 결합합니다.

코드를 작성하기 전에, 지도가 종종 적절한 컨테이너로 사용되는 이유를 아는 것이 도움이 됩니다.

std::map을 사용하는 이유는 무엇입니까?

지도를 사용하는 이유는 다음과 같습니다.

  • std::map은 선택한 정렬 기준에 따라 정렬된 순서로 고유 키만 저장합니다.
  • 키를 사용하면 요소를 쉽고 빠르게 검색할 수 있습니다.
  • 각 키에는 하나의 요소만 연결됩니다.
  • std::map은 연관 배열로 사용할 수 있습니다.
  • std::map은 균형 이진 트리를 사용하여 구현할 수 있습니다.

이러한 이점을 활용하려면 먼저 선언 구문부터 살펴보세요.

통사론

std::map을 선언하려면 다음 구문을 사용하세요.

std::map<key_datatype, value_datatype>map_name; 
  • The 키 데이터 유형 맵 키의 데이터 유형을 나타냅니다.
  • The 값_데이터 유형 맵 키에 해당하는 값의 데이터 유형을 나타냅니다.
  • The 지도 이름 지도의 이름입니다.

예 :

map<string, int> my_map; 

우리는 my_map이라는 이름의 맵을 선언했습니다. 이 맵은 키 데이터 타입으로 문자열을, 값 데이터 타입으로 정수를 갖습니다.

회원 유형

멤버 함수는 다음 멤버 유형을 매개변수 또는 반환 유형으로 사용할 수 있습니다.

  • 키 유형: 키(템플릿의 첫 번째 매개변수)
  • 매핑_유형: T (템플릿의 두 번째 매개변수)
  • 키_비교: (템플릿의 세 번째 매개변수를) 비교하세요.
  • 할당자 유형: 할당(템플릿의 네 번째 매개변수)
  • 값_유형:
  • 값_비교: 요소 비교를 위한 중첩 함수 클래스
  • 참고: allocator_type::참조
  • const_reference: allocator_type::const_reference
  • 포인터: allocator_type::포인터
  • const_pointer: allocator_type::const_pointer
  • 반복자: value_type에 대한 양방향 반복자
  • const_iterator: const value_type에 대한 양방향 반복자
  • reverse_iterator: 역방향 반복자
  • const_reverse_iterator: 상수 역방향 반복자
  • 차이_유형: ptrdiff_t
  • 크기 유형: size_t

std::map의 내장 함수

std::map에는 내장 함수가 포함되어 있습니다. 이들 중 일부는 다음과 같습니다:

  • 시작 () 이 함수는 맵의 첫 번째 항목에 대한 이터레이터를 반환합니다.
  • 크기() 이 함수는 지도에 있는 항목의 개수를 반환합니다.
  • 비어 있는() 이 함수는 맵이 비어 있는지 여부를 나타내는 부울 값을 반환합니다.
  • 삽입(키, 값 쌍) 이 함수는 맵에 새로운 키-값 쌍을 삽입합니다.
  • find(val) 이 함수는 val 요소가 발견되면 해당 요소의 이터레이터를 반환합니다. 그렇지 않으면 m.end()를 반환합니다.
  • 지우기(반복자 위치) 이 함수는 이터레이터가 가리키는 위치의 항목을 삭제합니다.
  • 지우기(const g) 이 함수는 맵에서 키-값 쌍 'g'를 삭제합니다.
  • 맑은() 이 함수는 지도에서 모든 항목을 삭제합니다.

함수들이 정의되었으므로, 다음 예제들을 통해 이러한 함수들을 실제로 적용해 보겠습니다. 첫 번째 예제는 반복 작업입니다.

지도 요소 반복

지도 요소들을 순회할 수 있습니다. 이를 위해 이터레이터를 생성하고 사용하면 됩니다. 예를 들면 다음과 같습니다.

예제 1

#include <iostream>
#include <string>
#include <map> 

using namespace std;
int main() {

	map<int, string> Students;

	Students.insert(std::pair<int, string>(200, "Alice"));

	Students.insert(std::pair<int, string>(201, "John"));

	cout << "Map size is: " << Students.size() << endl;

	cout << endl << "Default map Order is: " << endl;

	for (map<int, string>::iterator it = Students.begin(); it != Students.end(); ++it) {

		cout << (*it).first << ": " << (*it).second << endl;
	}
}

출력:

C++ 맵 반복 예제 1 출력

다음은 코드의 스크린샷입니다.

C++ 맵 반복 예제 1 코드

Code 설명 :

  1. 해당 기능을 사용하려면 iostream 헤더 파일을 코드에 포함하세요.
  2. 해당 기능을 사용하려면 문자열 헤더 파일을 코드에 포함하세요.
  3. 해당 기능을 사용하려면 맵 헤더 파일을 코드에 포함하세요.
  4. 클래스를 호출하지 않고 사용하려면 코드에 std 네임스페이스를 포함하세요.
  5. main() 함수를 호출합니다. {는 함수 본문의 시작을 표시합니다.
  6. 키가 정수이고 값이 문자열인 Students라는 맵을 만듭니다.
  7. 맵 학생에 값을 삽입합니다. 키 200과 값 Alice가 맵에 삽입됩니다.
  8. 맵 학생에 값을 삽입합니다. 키 201과 값 John이 맵에 삽입됩니다.
  9. `size()` 함수를 사용하여 `Students`라는 이름의 맵 크기를 가져오세요. 이 함수는 2를 반환해야 합니다.
  10. 콘솔에 일부 텍스트를 인쇄합니다.
  11. for 루프를 사용하여 이름이 지정된 반복자를 생성하여 Students라는 지도 요소를 반복합니다.
  12. 콘솔에 맵 Students의 값을 인쇄합니다.
  13. for 루프 본문의 끝입니다.
  14. main() 함수 본문의 끝입니다.

std::map에 데이터 삽입

`insert()` 함수를 사용하여 `std::map`에 항목을 추가할 수 있습니다. `std::map`의 키는 고유해야 한다는 점을 기억하세요.

먼저 각 키가 맵에 존재하는지 확인합니다. 키가 존재하면 해당 항목은 삽입되지 않고 기존 항목의 이터레이터를 반환합니다. 키가 존재하지 않으면 항목이 삽입됩니다.

이 기능에는 다음과 같은 변형이 있습니다.

  • 삽입(쌍) 이 변형에서는 키-값 쌍이 맵에 삽입됩니다.
  • 삽입(시작_itr, 종료_itr) 이 변형을 사용하면 다른 맵의 start_itr 및 end_itr로 정의된 범위 내에 항목이 삽입됩니다.

insert_or_assign() 함수는 insert() 함수와 동일한 방식으로 작동하지만, 지정된 키가 맵에 이미 존재하는 경우 해당 값이 수정됩니다.

예제 2

#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 });

	m.insert_or_assign(1, 6);  
	
	cout << "Key\tElement\n";
	for (auto itr = m.begin(); itr != m.end(); ++itr) {
		cout << itr->first << '\t' << itr->second << '\n';
	}
	return 0;
}

출력:

C++ 맵 삽입 예제 2 출력

다음은 코드의 스크린샷입니다.

C++ 맵 삽입 예제 2 코드

Code 설명 :

  1. 해당 기능을 사용하려면 맵 헤더 파일을 코드에 포함하세요.
  2. 해당 기능을 사용하려면 iostream 헤더 파일을 코드에 포함하세요.
  3. 클래스를 호출하지 않고 사용하려면 코드에 std 네임스페이스를 포함하세요.
  4. main() 함수를 호출합니다. {는 함수 본문의 시작을 표시합니다.
  5. 키가 정수이고 값이 정수인 m이라는 맵을 만듭니다. 세 개의 항목이 지도에 작성되었습니다.
  6. 맵에 새 항목을 삽입합니다. m. 키 5와 값 6이 맵에 삽입됩니다.
  7. 이미 존재하는 키에 항목을 입력하려고 합니다. 키 1이 이미 맵에 존재하므로 항목이 작성되지 않습니다.
  8. insert_or_assign() 함수를 사용하여 기존 항목을 삽입하거나 수정합니다. 키 1이 이미 존재하므로 해당 값은 6으로 변경됩니다.
  9. 콘솔에 일부 텍스트를 인쇄합니다. "\t" 문자는 가로 공백을 만들고 "\n" 문자는 마우스 커서를 다음 줄로 이동합니다.
  10. 사용하십시오 for 루프 m이라는 맵의 요소를 반복하기 위해 itr이라는 이름의 반복자를 만듭니다.
  11. 콘솔에 맵 m의 값을 인쇄합니다. "\t" 문자는 각 키와 해당 값 사이에 수평 공백을 만듭니다. 반대로 "\n" 문자는 반복할 때마다 마우스 커서를 다음 줄로 이동합니다.
  12. for 루프 본문의 끝입니다.
  13. 프로그램은 성공적으로 완료되면 값을 반환해야 합니다.
  14. main() 함수 본문의 끝입니다.

지도에서 검색

`find()` 함수를 사용하면 키를 기준으로 맵의 요소를 검색할 수 있습니다. 키를 찾지 못하면 `std::map::end`를 반환하고, 찾으면 검색된 요소의 이터레이터를 반환합니다.

예제 3

#include <iostream>
#include <string>
#include <map> 
using namespace std;
int main() {
	map<int, string> Students;
	Students.insert(std::pair<int, string>(200, "Alice"));
	Students.insert(std::pair<int, string>(201, "John"));
	std::map<int, string>::iterator it = Students.find(201);
	if (it != Students.end()) {
		std::cout << endl << "Key 201 has the value: => "<< Students.find(201)->second << '\n';
	}
}

출력:

C++ 지도 찾기 검색 예시 3 출력

다음은 코드의 스크린샷입니다.

C++ 지도 찾기 검색 예제 3 코드

Code 설명 :

  1. 오류 없이 기능을 사용하려면 iostream 헤더 파일을 코드에 포함하십시오.
  2. 오류 없이 해당 기능을 사용하려면 문자열 헤더 파일을 코드에 포함하세요.
  3. 오류 없이 해당 기능을 사용하려면 맵 헤더 파일을 코드에 포함하세요.
  4. 클래스를 호출하지 않고 사용하려면 코드에 std 네임스페이스를 포함하세요.
  5. main() 함수를 호출하세요. { 는 main() 함수의 본문 시작을 나타냅니다.
  6. 키가 정수이고 값이 문자열인 Students라는 맵을 만듭니다.
  7. 맵 학생에 값을 삽입합니다. 키 200과 값 Alice가 맵에 삽입됩니다.
  8. 맵 학생에 값을 삽입합니다. 키 201과 값 John이 맵에 삽입됩니다.
  9. 201 키와 연관된 값을 찾으십시오.
  10. if 문을 사용하여 키 값이 발견되었는지 확인합니다.
  11. 콘솔의 일부 텍스트와 함께 키 값을 인쇄합니다.
  12. if 문의 본문 끝입니다.
  13. main() 함수 본문의 끝입니다.

지도에서 데이터 삭제

erase() 함수를 사용하면 맵에서 값을 삭제할 수 있습니다. 삭제할 요소를 가리키는 이터레이터를 생성한 다음, 이 이터레이터를 erase() 함수에 전달하면 됩니다.

예제 4

#include <iostream>
#include <string>
#include <map>

using namespace std;
int main() {

	map<std::string, int> my_map;

	my_map.insert(std::make_pair("cow", 1));

	my_map.insert(std::make_pair("cat", 2));

	my_map["lion"] = 3;

	map<std::string, int>::iterator it = my_map.find("cat");

	my_map.erase(it);

	for (map<string, int>::iterator it = my_map.begin(); it != my_map.end(); ++it)

		cout << (*it).first << ": " << (*it).second << endl;

  return 0;
}

출력:

C++ 지도 지우기 삭제 예제 4 출력

다음은 코드의 스크린샷입니다.

C++ 지도 지우기 삭제 예제 4 코드

Code 설명 :

  1. 해당 기능을 사용하려면 iostream 헤더 파일을 코드에 포함하세요.
  2. 해당 기능을 사용하려면 문자열 헤더 파일을 코드에 포함하세요.
  3. 해당 기능을 사용하려면 맵 헤더 파일을 코드에 포함하세요.
  4. 클래스를 호출하지 않고 사용하려면 코드에 std 네임스페이스를 포함하세요.
  5. main() 함수를 호출하세요. { 는 main() 함수의 본문 시작을 나타냅니다.
  6. 키가 문자열이고 값이 정수인 my_map이라는 맵을 만듭니다.
  7. my_map 맵에 값을 삽입합니다. Cow 키와 값 1이 맵에 삽입됩니다.
  8. my_map 맵에 값을 삽입합니다. Cat 키와 값 2가 맵에 삽입됩니다.
  9. 사자 키를 사용하여 my_map 맵에 값 3을 추가합니다.
  10. 키 고양이를 찾기 위해 my_map 맵을 반복하는 반복자를 만듭니다.
  11. 반복자가 가리키는 요소를 삭제합니다.
  12. 반복자를 사용하여 my_map 맵의 요소를 시작부터 끝까지 순회합니다.
  13. 콘솔에서 my_map 맵의 내용을 인쇄합니다.
  14. 프로그램은 성공적으로 완료되면 출력을 반환해야 합니다.
  15. main() 함수 본문의 끝입니다.

자주 묻는 질문

std::map은 자체 균형 이진 검색 트리를 사용하여 키를 정렬된 상태로 유지하며, O(log n) 연산 시간을 제공합니다. std::unordered_map은 해시 테이블을 사용하여 평균 O(1) 조회 시간을 제공하지만 키를 특정 순서 없이 저장합니다. 정렬 필요성에 따라 선택하십시오.

std::map은 일반적으로 자체 균형 이진 검색 트리, 특히 레드-블랙 트리로 구현됩니다. 이를 통해 키는 정렬된 상태로 유지되며 삽입, 삭제 및 검색 작업에 대해 로그 시간 복잡도를 보장합니다.

아니요. std::map은 고유한 키만 저장할 수 있으므로 기존 키를 삽입해도 덮어쓰여지지 않습니다. 중복 키가 필요한 경우에는 여러 요소가 동일한 키 값을 공유할 수 있는 std::multimap을 사용하세요.

`map_name[key]`를 사용하여 값을 읽거나 할당할 수 있습니다. 첨자 연산자는 키가 없는 경우 기본 항목을 삽입합니다. `at()` 멤버는 키가 없는 경우 예외를 발생시키므로 더 안전한 선택입니다.

std::map과 같은 사용자 지정 비교 연산자를 세 번째 템플릿 인수로 전달하세요. >. 더 큰 비교 연산자를 사용하면 기본 오름차순 대신 키가 가장 큰 값에서 가장 작은 값 순으로 정렬됩니다.

std::map은 키-값 쌍을 저장하고 키를 사용하여 값을 조회하는 반면, std::set은 연결된 값 없이 고유한 키만 저장합니다. 둘 다 요소를 정렬된 상태로 유지하지만, map은 각 키에 데이터를 연결합니다.

네. AI 코딩 도우미는 간단한 프롬프트나 주석을 입력받아 선언, 삽입 호출, 반복자 루프 등을 포함한 작동하는 std::map 코드로 변환합니다. 컴파일하기 전에 생성된 키 유형, 순서 및 예외 상황을 항상 검토하세요.

예. GitHub 부조종사 이 기능은 입력하는 동안 맵 선언, 삽입 및 검색 호출, 반복 루프를 제안합니다. 반복적인 상용구 코드를 잘 처리하지만, 빌드하기 전에 키 고유성과 논리를 검증해야 합니다.

이 게시물을 요약하면 다음과 같습니다.