지도 용법

원본:
http://www.51course.com/index.php?option=com_content&task=view&id=70&Itemid=31
1. map 의 구조 함수 map 는 모두 6 개의 구조 함 수 를 제공 합 니 다. 이것 은 메모리 분배 기 와 관련 된 것 입 니 다. 표 시 를 하지 않 습 니 다. 아래 에서 우 리 는 map 의 구조 방법 을 접 할 것 입 니 다. 여기 서 말 하고 자 하 는 것 은 다음 과 같은 방법 으로 map: map < int, string > mapStudent 를 구성 하 는 것 입 니 다.2. 데이터 가 구조 맵 용기 에 삽입 되면 우 리 는 안에 데 이 터 를 삽입 할 수 있 습 니 다.여기 서 데 이 터 를 삽입 하 는 세 가지 방법 을 설명 합 니 다. 예 1:
#pragma warning (disable:4786)
#include <string>
#include <map>
#include <iostream>
using namespace std;

typedef map<int,string> mymap;

int main()
{
    mymap student;
    //          :
    student.insert(pair<int,string>(2,"student-two"));
    student.insert(mymap::value_type(3,"student-three"));
         student[1] = "student-one";
    mymap::iterator iter;
    for(iter = student.begin(); iter != student.end(); iter++)
    {
        cout<<iter->first<<"  "<<iter->second<<endl;
    }
    return 0;
}

상기 세 가지 용법 은 모두 데이터 의 삽입 을 실현 할 수 있 지만 차이 가 있 습 니 다. 물론 첫 번 째 와 두 번 째 방법 입 니 다.
효과 적 으로 똑 같이 완성 되 었 습 니 다. insert 함수 로 데 이 터 를 삽입 하고 데이터 삽입 에 있어 집합 과 관련 된 유일 성 입 니 다.
개념, 즉 맵 에 이 키워드 가 있 을 때 insert 작업 은 데 이 터 를 삽입 할 수 없 지만 배열 방식 으로 는 다 릅 니 다.
이전 키워드 에 대응 하 는 값 을 덮어 쓰 고 프로그램 으로 설명 할 수 있 습 니 다.
mapStudent.insert(map::value_type (1, “student_one”));
mapStudent.insert(map::value_type (1, “student_two”));
위의 두 문장 이 실 행 된 후 맵 에서 1 이라는 키워드 가 대응 하 는 값 은 'student one' 이 고 두 번 째 문장 은
효력 이 발생 합 니 다. 그러면 insert 문구 가 성공 적 으로 삽입 되 었 는 지 어떻게 알 수 있 는 지 에 관 한 문제 입 니 다. pair 로 얻 을 수 있 습 니 다.
삽입 에 성 공 했 는 지 여 부 는 다음 과 같 습 니 다.
Pair::iterator, bool> Insert_Pair;
Insert_Pair = mapStudent.insert(map::value_type (1, “student_one”
));
우 리 는 pair 의 두 번 째 변 수 를 통 해 삽입 성공 여 부 를 알 수 있 습 니 다. 첫 번 째 변 수 는 map 의 교체 입 니 다.
기, 삽입 에 성공 하면 InsertPair. second 는 true 여야 합 니 다. 그렇지 않 으 면 false 입 니 다.
삽입 성공 여 부 를 보 여 주 는 완료 코드 입 니 다.
#pragma warning (disable:4786)
#include <map>
#include <string>
#include <iostream>
using namespace std;
typedef map<int,string> mymap;
int main()
{
    map<int, string> mapStudent;
    pair< mymap::iterator, bool> Insert_Pair;
    Insert_Pair = mapStudent.insert(pair<int,string>(1, "student_one"));
    if(Insert_Pair.second == true)
    {
        cout<<"Insert Successfully"<<endl;
    }
    else
    {

        cout<<"Insert Failure"<<endl;
    }
    Insert_Pair = mapStudent.insert(pair<int, string>(1,"student_two"));
    if(Insert_Pair.second == true)
    {
        cout<<"Insert Successfully"<<endl;
    }
    else
    {
        cout<<"Insert Failure"<<endl;
    }
    mymap::iterator  iter;
    for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
    {
        cout<<iter->first<<"  "<<iter->second<<endl;
    }
    return 0;
}

3. 맵 의 크기
맵 에 데 이 터 를 삽입 하 였 습 니 다. 현재 얼마나 많은 데 이 터 를 삽입 하 였 는 지 어떻게 압 니까? size 함수 로 사용 할 수 있 습 니 다.
법 은 다음 과 같다.
Int nSize = mapStudent.size();
4. 데이터 의 이동
여기 도 맵 을 옮 겨 다 니 는 세 가지 방법 을 제공 합 니 다.
첫 번 째: 응용 전 방향 교체 기, 위의 예 를 들 어 프로그램 이 곳곳에 있 습 니 다.
두 번 째: 반사 교체 기 를 사용 하여 다음 과 같은 예 를 들 어 효 과 를 체험 하려 면 스스로 프로그램 을 실행 하 십시오.
#pragma warning (disable:4786)

#include <map>
#include <string>
#include <iostream>
using namespace std;


typedef map<int,string> mymap;
int main()
{
    mymap mapStudent;
    mapStudent.insert(pair<int, string>(1, "student_one "));
    mapStudent.insert(pair<int, string>(2,  "student_two "));
    mapStudent.insert(pair<int, string>(3,  "student_three "));
    mymap::reverse_iterator  iter;
    for(iter = mapStudent.rbegin(); iter != mapStudent.rend(); iter++)
    {
        cout<<iter->first<< "    "<<iter->second<<endl;
    }
    return 0;
}

세 번 째: 배열 방식 으로 프로그램 설명 은 다음 과 같다.
#pragma warning (disable:4786)

#include <map>
#include <string>
#include <iostream>
using namespace std;

int main()
{
    map<int, string> mapStudent;
    mapStudent.insert(pair<int, string>(1, "student_one "));
    mapStudent.insert(pair<int, string>(2,  "student_two "));
    mapStudent.insert(pair<int, string>(3,  "student_three "));
    int nSize = mapStudent.size();
    for(int nIndex = 1; nIndex <= nSize; nIndex++)  //        1   !!!!
    {
        cout<<mapStudent[nIndex]<<endl;
    }
    return 0;
}

5. 데이터 찾기 (이 키워드 가 맵 에 있 는 지 확인 하 는 것 포함)
여기에서 우 리 는 맵 이 데이터 삽입 시 질서정연 한 장점 을 확보 한 다 는 것 을 체득 할 것 이다.
하나의 데이터 (키워드) 가 맵 에 나타 나 는 지 여 부 를 결정 하 는 방법 이 비교적 많 습 니 다. 이 제목 은 데이터 검색 이지 만,
여기에 대량의 맵 기본 용법 이 삽입 되 어 있 습 니 다.
여기 세 가지 데이터 찾기 방법 을 제시 합 니 다.
첫 번 째: count 함수 로 키워드 의 출현 여 부 를 판정 합 니 다. 그 단점 은 데이터 의 출현 위 치 를 찾 을 수 없습니다. 맵 의
특성, 1 대 1 의 맵 관 계 는 count 함수 의 반환 값 이 두 개 밖 에 없 음 을 결정 합 니 다. 0 이 든 1 이 든 나 옵 니 다.
현재 의 상황 은 당연히 1 로 돌아 가 야 한다.
두 번 째: find 함수 로 데이터 가 나타 나 는 위 치 를 찾 습 니 다. 데이터 가 나타 날 때 되 돌아 오 는 교체 기 입 니 다.
위치 에 있 는 교체 기 에 따 르 면 map 에서 찾 을 데이터 가 없 으 면 되 돌아 오 는 교체 기 는 end 함수 가 되 돌아 오 는 교체 기 와 같 습 니 다.
프로그램 설명
#pragma warning (disable:4786)

#include <map>
#include <string>
#include <iostream>
using namespace std;

int main()
{
    map<int, string> mapStudent;
    mapStudent.insert(pair<int, string>(1, "student_one "));
    mapStudent.insert(pair<int, string>(2,  "student_two "));
    mapStudent.insert(pair<int, string>(3,  "student_three "));
    map<int, string>::iterator iter;
    iter = mapStudent.find(1);
    if(iter != mapStudent.end())
    {
        cout<<"Find, the value is: "<<iter->second<<endl;
    }
    else
    {
        cout<<"Do not Find"<<endl;
    }
    return 0;
}

세 번 째: 이 방법 은 데이터 가 나 타 났 는 지 아 닌 지 를 판단 하 는 데 사용 되 는데 좀 멍청해 보이 지만 여기 서 설명 하려 고 합 니 다.
Lower_bound 함수 용법, 이 함 수 는 키 워드 를 찾 으 려 는 하 계 를 되 돌려 줍 니 다. (교체 기 입 니 다)
Upper_bound 함수 용법, 이 함 수 는 키 워드 를 찾 을 상계 (교체 기) 를 되 돌려 줍 니 다.
예 를 들 어 맵 에 1, 2, 3, 4 가 삽입 되 어 있 으 면 lowerbound (2) 하면 돌아 오 는 2, 그리고
upper - bound (2) 하면 돌아 오 는 게 3 이에 요.
Equal_range 함수 가 pair 를 되 돌려 줍 니 다. pair 의 첫 번 째 변 수 는 Lower 입 니 다.bound 되 돌아 오 는 교체 기, pair 리
면 두 번 째 교체 기 는 Upperbound 에서 되 돌아 오 는 교체 기, 이 두 개의 교체 기 가 같다 면 map 에 없 음 을 설명 합 니 다.
이 키워드 가 나타 나 면 프로그램 설명
#pragma warning (disable:4786)

#include <map>
#include <string>
#include <iostream>
using namespace std;

int main()
{
    map<int, string> mapStudent;
    mapStudent[1] =  "student_one" ;
    //    mapStudent[2] =  "student-two" ;
    mapStudent[3] =  "student_three";
    mapStudent[5] =  "student_five";
    map<int, string>::iterator  iter;
    iter = mapStudent.lower_bound(2);
     //      3    
    cout<<iter->second<<endl;

    iter = mapStudent.lower_bound(3);
    //      3    
    cout<<iter->second<<endl;

    iter = mapStudent.upper_bound(2);
    //      3    
    cout<<iter->second<<endl;

    iter = mapStudent.upper_bound(3);
    //      5    
    cout<<iter->second<<endl;

    pair<map<int, string>::iterator, map<int, string>::iterator> mapPair;
    //pair        Lower_bound      ,pair         
    //Upper_bound      ,            ,   map   
    //      
    mapPair = mapStudent.equal_range(2);
    if(mapPair.first == mapPair.second)
    {
        cout<<"Do not Find"<<endl;
    }
    else
    {
        cout<<"Find"<<endl;
    }
    mapPair = mapStudent.equal_range(3);
    if(mapPair.first == mapPair.second)
    {
        cout<<"Do not Find"<<endl;
    }
    else
    {
        cout<<"Find"<<endl;
    }
    return 0;
}

6. 데이터 의 삭제 와 공백 판정
맵 의 데 이 터 를 비우 면 clear () 함수 로 맵 에 empty () 함수 가 있 는 지 확인 하고 되 돌려 줍 니 다.
true 는 빈 맵 임 을 설명 합 니 다.
기타 일부 함수 용법
여기 swap, keycomp,value_comp,get_allocator 등 함수, 이 함수 들 이 프로 그래 밍 에 사용 되 는 것 이 아니 라 는 것 을 느 꼈 습 니 다.
많다
9. 정렬
여기 서 말 하고 자 하 는 것 은 비교적 깊 은 용법 입 니 다. 정렬 문제, STL 에 서 는 기본적으로 작은 번호 로 정렬 합 니 다. 이상 세대 입 니 다.
코드 는 정렬 에 있어 서 아무런 문제 가 없습니다. 위의 키 워드 는 int 형 이기 때문에 그 자체 가 번호 연산 보다 작은 것 을 지원 합 니 다.
일부 특수 한 상황, 예 를 들 어 키 워드 는 하나의 구조 체 로 정렬 과 관련 되면 문제 가 발생 할 수 있다. 왜냐하면 이것 은 번호 체조 보다 작 지 않 기 때문이다.
작, insert 등 함수 가 컴 파일 할 때 지나 갈 수 없 으 며, 아래 에 두 가지 방법 을 제시 하여 이 문 제 를 해결 합 니 다.
첫 번 째: 작은 번호 로 다시 불 러 오기, 프로그램 예
#pragma warning (disable:4786)

#include <map>
#include <string>
#include <iostream>
using namespace std;

int main()
{
    map<int, string> mapStudent;
    mapStudent.insert(pair<int, string>(1, "student_one"));
    mapStudent.insert(pair<int, string>(2, "student_two"));
    mapStudent.insert(pair<int, string>(3, "student_three"));


    //          ,        ,          
    //     1,      
    map<int, string>::iterator iter;
    iter = mapStudent.find(1);
    mapStudent.erase(iter);

    for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
    {
        cout << iter->first<< " "<<iter->second<<endl;
    }

    cout<<endl;

    mapStudent.insert(pair<int, string>(1, "student_one"));
    //     1,      
    int n = mapStudent.erase(1);//        1,    0
    for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
    {
        cout << iter->first<< " "<<iter->second<<endl;
    }
    cout<<endl;

    mapStudent.insert(pair<int, string>(1, "student_one"));
    //    ,     
    //       map  
    mapStudent.erase(mapStudent.begin(), mapStudent.end());
    //         ,  STL   ,              
    for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
    {
        cout << iter->first<< " "<<iter->second<<endl;
    }
    cout<<"size: "<<mapStudent.size()<<endl;

    return 0;
}

10. 그리고
STL 은 하나의 통 일 된 전체 이기 때문에 map 의 많은 용법 은 STL 의 다른 것 과 결합 된다. 예 를 들 어 정렬 하 는 것 이다.
위, 여기 서 기본적으로 사용 하 는 것 은 작은 번호, 즉 less < > 입 니 다. 큰 것 부터 작은 것 까지 정렬 하려 면 여기 서 관련 된 것 이 많 습 니 다.
여기 서 일일이 설명 할 수 없다.
또한 맵 에 서 는 내부 가 질서 가 있 고 빨 간 검 은 나무 가 보증 하기 때문에 많은 함수 들 이 실행 하 는 시간 복잡 도 를 설명 합 니 다.
log2N 입 니 다. map 함수 로 가능 한 기능 이 고 STL Algorithm 도 이 기능 을 완성 할 수 있 습 니 다. 권장 합 니 다.
map 자체 함수, 효율 이 높 습 니 다.
다음은 맵 의 공간 적 특성 입 니 다. 그렇지 않 으 면 가끔 씩 우울 하 게 표현 할 수 있 을 것 같 습 니 다. 맵 의
모든 데 이 터 는 빨간색 과 검은색 트 리 의 한 노드 에 대응 합 니 다. 이 노드 는 데 이 터 를 저장 하지 않 을 때 16 개의 바이트 를 차지 합 니 다.
부모 노드 포인터, 좌우 아이 포인터, 그리고 매 거 진 값 (빨간색 과 검은색 을 표시 하 는 것 은 균형 이 잡 힌 이 진 트 리 의 균형 에 해당 합 니 다.
인자).......................................................................

좋은 웹페이지 즐겨찾기