목차
1. 연관 컨테이너
2. 키-값 쌍
키의 유형은 첫 번째 템플릿의 유형이고 값의 유형은 두 번째 템플릿의 유형입니다.
stl30의 쌍 설계는 다음과 같습니다.
template <class T1, class T2>
struct pair {
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair() : first(T1()), second(T2()) {}
pair(const T1& a, const T2& b) : first(a), second(b) {}
#ifdef __STL_MEMBER_TEMPLATES
template <class U1, class U2>
pair(const pair<U1, U2>& p) : first(p.first), second(p.second) {}
#endif
};
3. 트리 구조의 연관 컨테이너
트리 구조의 연관 컨테이너: 맵, 세트, 멀티맵, 멀티세트.
이 네 가지 컨테이너 의 공통점 : 균형 잡힌 검색 트리(즉, 레드-블랙 트리 )를 기본 결과로 사용하고 컨테이너의 요소는 순서가 있는 시퀀스입니다.
3.1 세트
3.1.1 세트 소개
알아채다:1. 맵/멀티맵과 달리 실제 키-값 쌍 <키, 값>은 맵/멀티맵에 저장되며,값이지만 <value, value>로 구성된 키-값 쌍은 실제로는 최하위 계층에 저장됩니다.2. 집합에 요소를 삽입할 때 값만 삽입하면 되며 키-값 쌍을 구성할 필요가 없습니다.3. 집합의 요소는 반복될 수 없습니다(따라서 중복 제거를 위해 집합을 사용할 수 있음).4. 집합 반복자를 사용하여 집합의 요소를 순회하여 정렬된 시퀀스를 얻습니다.5. 집합의 요소는 기본적으로 다음보다 적게 비교됩니다.6. 세트에서 요소를 찾기 위한 시간 복잡도는 다음과 같습니다. log(n)7. 세트의 요소는 수정할 수 없습니다.8. 집합의 최하위 레이어는 이진 검색 트리(레드-블랙 트리)를 사용하여 구현됩니다.
3.1.2 세트 사용
- 세트의 템플릿 매개변수 목록
2. set 사용 예(문서의 기능 보기)
- 구조
- 반복자
- 작업 수정
3.2 멀티셋
3.2.1 다중 집합 소개
알아채다:
1. 다중집합의 최하층에는 <값,값>의 키-값 쌍이 저장된다.2. mtltiset의 삽입 인터페이스에만 삽입하면 됩니다.3. set과의 차이점은 multiset의 요소는 반복될 수 있고 set의 값은 고유하다는 것입니다.4. 반복자를 사용하여 multiset의 요소를 순회하여 정렬된 시퀀스를 얻습니다.5. multiset의 요소는 수정할 수 없습니다.6. 다중 집합에서 요소를 찾으십시오. 시간 복잡도는 log(N)입니다.7. 다중 집합의 역할: 요소를 정렬할 수 있음
3.2.2 다중 집합의 사용
- multiset.count(통계 수)
- multiset.find(val) - inorder의 첫 번째 val에 대한 반복자를 반환합니다.
- multiset.erase(val) - 모든 값 삭제
3.3 지도
3.3.1 지도 소개
3.3.2 지도 사용
- 지도 템플릿 매개변수 설명
2. 지도 사용
작업은 set의 작업과 거의 동일합니다. 문서를 읽고 스스로 학습할 수 있습니다. operator[ ] 에 집중하세요.
액세스 요소:
k가 컨테이너에 있는 요소의 키와 일치 하면 함수는 매핑된 값 에 대한 참조를 반환합니다 .
k가 컨테이너에 있는 요소의 키와 일치하지 않는 경우 함수는 해당 키가 있는 새 요소를 삽입 하고 매핑 된 값 에 대한 참조를 반환합니다 . 이렇게 하면 매핑된 값이 요소에 할당되지 않은 경우에도 항상 컨테이너 크기가 1씩 증가합니다(요소는 기본 생성자를 사용하여 구성됨 ).
요약하다:
- 지도::연산자[ ]
1. 맵에 이 키가 있고 값에 대한 참조가 반환됩니다. (값 찾기, 수정)
2. 맵에 해당 키가 없으면 pair(key, V())가 삽입되고 값에 대한 참조가 반환됩니다. (삽입 + 수정)
- 지도::삽입
1. 키가 이미 맵에 있으므로 pair(key_iterator, false)를 반환합니다.
2. 키가 맵에 없으면 pair(new_key_iterator, true) 반환
3.4 멀티맵
3.4.1 멀티맵 소개
3.4.2 멀티맵 사용
4. 운동
마지막으로 지도와 집합에 대한 연습문제 2개를 더 게시합니다 이론+실습으로 글을 써보셔도 되고 직접 이해하시면 정말 이해가 되실거에요!
상위 K 빈도 단어 https://leetcode.cn/problems/top-k-frequent-words/description/
class Solution {
public:
vector<string> topKFrequent(vector<string>& words, int k) {
map<string,int>Countmap;
//map[]插入+修改实现统计
for(auto& str:words)
{
Countmap[str]++;
}
//比较次数,我们把次数作为Key,降序排
multimap<int,string,greater<int>>sortmap;
for(auto& kv:Countmap)
{
sortmap.insert(make_pair(kv.second,kv.first));
}
vector<string>v;
multimap<int,string,greater<int>>::iterator it=sortmap.begin();
while(k--)
{
v.push_back(it->second);
++it;
}
return v;
}
};
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
//找交集(有序):小的往后走,相等找到存入并同时走
set<int>s1(nums1.begin(),nums1.end());
set<int>s2(nums2.begin(),nums2.end());
auto it1=s1.begin();
auto it2=s2.begin();
vector<int>v;
while(it1!=s1.end()&&it2!=s2.end())
{
if(*it1<*it2)
{
++it1;
}
else if(*it2<*it1)
{
++it2;
}
else
{
v.push_back(*it1);
++it1;
++it2;
}
}
return v;
}
};