C++Primer 독서노트(8)

28805 단어
STL 컨테이너 연관 컨테이너
세트 및 다중 세트(set 및 multiset 컨테이너 클래스):
컬렉션(#include)은 컨테이너로서 해당 컨테이너에 포함된 요소의 값이 고유합니다.이것은 데이터의 구체적인 값을 수집할 때 유용하다.집합 중의 원소는 일정한 순서에 따라 배열되어 집합 중의 실례로 여겨진다.데이터를 저장하기 위해 키/값 쌍 (pair) 이 필요하다면 맵 (또한 관련 용기이며, 다음에 곧 설명할 것) 은 더 좋은 선택입니다.하나의 집합은 체인 테이블을 통해 구성되며, 삽입 작업과 삭제 작업은 방향 (vector) 보다 빠르지만, 끝에 있는 요소를 찾거나 추가할 때 느립니다.
집중에서는 모든 구성원이 배열되어 있다.
하면, 만약, 만약...
이 집합을 출력할 때: 2, 3, 5, 12, 65123
집합과 다집합의 차이는 다음과 같다. set은 유일한 키 값을 지원하고 set의 값은 모두 특정하며 한 번만 나타난다.멀티셋에 던전 키가 나타날 수 있고 같은 값이 여러 번 나타날 수 있다.
Set 및 multiset의 템플릿 매개 변수:
template<class key, class compare, class Allocator=allocator

첫 번째 매개 변수 키는 저장된 키의 유형이고, 두 번째 매개 변수는 정렬 값을 위한 비교 함수의 유형이며, 세 번째 매개 변수는 실현된 저장 분배자의 유형이다.몇몇 컴파일러의 구체적인 실현에서 세 번째 매개 변수는 생략할 수 있다.두 번째 파라미터는 적당한 형식의 교체기를 사용하여 키에 특정한 관계 조작부호를 정의하고 용기에서 값을 반복할 때 순서를 정합니다.집합된 교체기는 양방향이고 상수이기 때문에 교체기가 사용할 때 원소의 값을 수정할 수 없습니다.
Set은 다음과 같은 세 가지 구조 함수를 정의합니다.
기본 구조 함수:

    
    
    
    
  1. explicit set(const Compare&=compare());  

예:

    
    
    
    
  1. set<int,less<int> > set1; 

less는 내림차순 배열 함수 대상을 형성하는 표준 클래스입니다.오름차순 배열은greater를 사용합니다.미리 정의된 구간을 지정하여 set 객체의 구조 함수를 초기화합니다.

    
    
    
    
  1. template<class InputIterator> set(InputIterator, InputIterator,\ const Compare&=compare()); 

예:

    
    
    
    
  1. set<int ,less<int> >set2(vector1.begin(),vector1.end()); 

복제 구조 함수:

    
    
    
    
  1. set(const set<Key,Compare&>);  

예:

    
    
    
    
  1. set<int ,less<int> >set3(set2);  

다음은 간단한 세트와 다중 세트의 삽입 루틴을 살펴보겠습니다.
#include<iostream>
#include <set>
#include <map>
using namespace std;

int main(int argv, char **argc)
{
	set<int> set1;  
	for(int i=0; i<10; ++i)  
	{
		set1.insert(i); 
	}
	for(set<int>::iterator p=set1.begin(); p!=set1.end(); ++p)
	{
		cout<<*p<<" "; 
	}
	cout<<endl;
	if(set1.insert(3).second)// 3   set1   
		//     set1.insert(3).second  1,    0  
		//   ,     3     ,         
	{
		cout<<"set insert success";
	}
	else 
	{
		cout<<"set insert failed";
	}
	int a[] = {4, 1, 1, 1, 1, 1, 0, 5, 1, 0};  
	multiset<int> A;  
	A.insert(set1.begin(),set1.end());  
	A.insert(a, a+10);  
	cout<<endl;  
	for(multiset<int>::iterator p=A.begin();p!=A.end();++p)
	{
		cout<<*p<<" "; 
	} 
return 0;
}

매핑 및 다중 매핑 (map 및 multimap)
매핑 및 다중 매핑(#include)은 특정 유형의 Key 키 세트의 존재를 기반으로 T 유형의 데이터를 신속하고 효율적으로 검색합니다.맵의 경우 키는 용기에 저장된 어떤 구성원을 가리킨다.Map은 복제본 키를 지원하지 않으며, multimap은 복제본 키를 지원합니다.Map과 멀티맵 대상은 키와 키와 관련된 값을 포함하고 키와 값의 데이터 형식은 set과 다르다.
set의 키와value는Key 형식이고 맵의 키와value는pair구조의 두 분량입니다.Map은 다음 표 연산자operator[]를 지원하며 맵은 일반 배열에 액세스하지만 맵의 키는 아래에 표시됩니다.멀티맵에서 한 키는 여러 개의 다른 값에 대응할 수 있습니다.
다음 예는 맵의 키와 값의 관계를 설명합니다.
#include<iostream>
#include <set>
#include <map>
using namespace std;

int main(int argv, char **argc)
{
	map<char, int, less<char> > map1;  
	map<char, int,  less<char> >::iterator mapIter;  
	//char      ,int       
	//      ,       
	//    map1.insert(map<char,int,less<char> >::value_type(''c'',3));   
	map1['c']=3;  
	map1['d']=4;   
	map1['a']=1;  
	map1['b']=2;   
	for(mapIter = map1.begin(); mapIter != map1.end(); ++mapIter)  
	{
		cout<<" "<<(*mapIter).first<<": "<<(*mapIter).second; 
	}
	//first      char ,second      int    
	//     d        :  
	map<char,int,less<char> >::const_iterator ptr;   
	ptr = map1.find('d');  
	cout<<'
'<<" "<<(*ptr).first<<" :"<<(*ptr).second; return 0; }

상기 절차에서 맵 대상의 행위가 일반 그룹의 행위와 유사하다는 것을 알 수 있다.Map에서는 두 개 이상의 값에 비교 연산자를 사용할 수 있습니다.다음은 멀티맵을 살펴보겠습니다.
#include<iostream>
#include <map>
#include<string>
using namespace std;
int main(int argv, char **argc)
{
    multimap<string,string,less<string> >mulmap;  
	multimap<string,string,less<string> >::iterator p;  
	//       mulmap:   
	typedef multimap<string,string,less<string> >::value_type vt;  
	typedef string s;  
	mulmap.insert(vt(s("tianqi "),s("is a zhu")));  
	mulmap.insert(vt(s("tianqi" ),s("is a zhupo")));  
	mulmap.insert(vt(s("tianqi "),s("is a lovely zhupo!")));  
	mulmap.insert(vt(s("jincheng "),s("is a boy")));  
	mulmap.insert(vt(s("jincheng "),s("is a handsome boy")));  
	mulmap.insert(vt(s("TQ "),s("is a sexy girl")));  
	//            mulmap:   
	for(p=mulmap.begin();p!=mulmap.end();++p)  
	{
		cout<<(*p).first<<(*p).second<<endl;  
	}
	//     Jerry           
	cout<<"find tianqi :"<<endl;  
	p=mulmap.find(s("tianqi "));  
	while((*p).first=="tianqi ")  
	{   
		cout<<(*p).first<<(*p).second<<endl;  
		++p;  
	}   
	return 0;
}

맵에서는 한 키가 여러 값에 대응하는 것을 허용하지 않습니다.multimap에서operator[]는 지원하지 않습니다. 즉 맵에서 허용하는 커서 동작은 지원하지 않습니다.

좋은 웹페이지 즐겨찾기