다양한 프로그래밍 언어 (C ++ 버전)를 다루는이 13 개 데이터 구조를 알아보기

너무 오래 데이터 구조 및 알고리즘에 대한 학교, 요약, 우리는이 시간 동안 학습 결과를 보는 방식에 올 필요가있다. 데이터 구조 C ++ 언어 자체는 예를 제공한다. 당신이 13 데이터 구조를 마스터 할 수 있다면, 우리는 어려움을 겪고되지 않은 다른 언어를 배우는 믿습니다. 

배열의 배열 

당신이 크기를 알 필요가 배열 초기화 시간, 후속는 크기를 변경할 수 없습니다 인덱스로 인덱스에 저장된 요소를 얻을 수 있습니다. C ++ 소스 코드에 의해 알 수있다, 그것은 실제로 C의 기초 배열에 패키지되어 : 

 

#INCLUDE <배열>

보이드 testArray () {

배열을 만들기 //

표준 : 배열 <INT 5> A = {2, 4, 6, 8, 10};

어레이를 통과 //

대한 (const를 자동 I : A) {

표준 : COUT << I << 표준 : ENDL;

}

대해 INT (I = 0; I)는 (a.size를 <; 내가 ++) {

표준 : COUT << A [I] << 표준 : ENDL;

}

// 가져 [인덱스]에 의해 제 1 값을 취할

표준 : COUT << "는 [0] ="<< A [0] << 표준 : ENDL;

어레이의 제 1 값을 수정 //

A [0] = 5;

/ **

인덱스 간 경계 할 것인지하지 않을 월경이 중단되며, A [인덱스]를 체크;

libc의 abi.dylib ++ : STD 형의 캐치되지 않는 예외 :: out_of_range으로 종료 : 배열에서 ::

* /

a.at (0);

// 배열이 비어있는 경우

a.empty ();

// 배열의 길이를 찾을 수

표준 : COUT << "a.size () ="<< a.size () << 표준 : ENDL;

// 처음 네 개의 값을 얻을

INT 값 = STD는 얻을 :: <4> (a);

표준 : COUT << "는 (4) ="<< 값 << 표준 : ENDL;

빈 어레이를 생성 // 배열 값의 값이 0 또는 그 밖의 유형 같다

표준 : 배열 <INT 5> (A2);

표준 : COUT << "단부 A2 '<< (A2) [0] << 표준 : ENDL;

// 배열의 두 요소를 비교 여부 같다

경우 (a ==의 A2) {}

}

변수 배열, 벡터, 벡터

배열 변수로 저장 벡터를 이용하여 C ++에서, 용량은 동적으로 결정된 초기화 될 필요가 변경 될 때 상기 어레이의 크기. 기본적 배열에서 사용하는 것과 동일한 방법.

 

#INCLUDE <벡터>

// 벡터

보이드 testVector () {

/ **

벡터 <T> 그것을 다른 어레이는 크기가 가변적

* /

표준 : : 벡터 <표준 : : 문자열> V;

적어도 20 개 요소를 수용 용기의 용량을 증가 //

v.reserve (20);

벡터를 초기화 //

STD : 벡터 <INT> V2 = {2, 4, 5, 7};

벡터로 배열을 초기화 //

표준 : 배열 <표준 : 문자열 5> {단어 "하나", "2", "세", "네", "5"};

표준 : : 벡터 <표준 : : 문자열> words_copy는 {표준은 : (단어), 표준 : 말 (단어를) 시작};

// 받거나 V에 의해 요소를 수정할 [인덱스]

표준 : COUT << "V [0] ="<< V2 [1] << 표준 : ENDL;

// 첫 번째 요소를 가져옵니다

표준 : COUT << "v.front () ="<< v2.front () << 표준 : ENDL;

// 삽입 단부 (9)의 값

v2.push_back (9);

// 삽입 단부 (2)의 값

v2.emplace_back (2);

// 첫번째 요소를 삭제, 전달 된 값은 반복자

v2.erase (v2.begin ());

// 길이

v2.size ();

모든 요소를 ​​제거 //

v2.clear ();

마지막 요소를 제거 //

v2.pop_back ();

의 끝에 요소를 삽입 //

v2.insert (v2.end (), 3);

}

이중 연결리스트 목록 

이중 전방 포인터 가리키고 노드의 후방 노드를 갖는 링크 목록. 그 자체로 C ++는 양방향 링크 된 목록을 제공합니다.

 

#INCLUDE <일람>

보이드 testList () {

목록 <문자열> 단어 { "안녕하세요", "목록"};

// 헤더 삽입 소자

words.push_front ( "push_fron");

words.emplace_front ( "emplace_front");

꼬리를 삽입 //

words.push_back ( "와 push_back");

words.emplace_back ( "emplace_back");

지정된 위치에 삽입 //

words.insert (words.begin () ++, "삽입");

요소를 삭제 //

words.remove ( "push_fron");

// 반복자를 통해리스트의 요소에 액세스 할 수

리스트 <문자열> :: = 반복자 beg_iter words.begin ();

리스트 <문자열> :: = 반복자 end_iter words.end ();

COUT << "beg_iter"<< * beg_iter << ENDL;

COUT << "end_iter"<< * end_iter << ENDL;

 

{: (단어 자동 A)에 대한

COUT << << ENDL;

}

}

단일 연결리스트 forward_list 

단 하나의 목록 포인터 포인트는 다음 노드로하는 단일 연결리스트의 전면에 우리는 연산 문제를 많이 할.

 

#INCLUDE <forward_list>

보이드 testForwardList () {

forward_list <문자열> flist { "이름", "lefe", "안녕하세요"};

크기를 계산 //

자동 카운트 = 거리 (,) flist (단부 (flist)을 시작한다);

COUT << "크기"<< 카운트 << ENDL;

// 머리를 삽입

flist.push_front ( "before3");

머리에 삽입 //

flist.insert_after (flist.begin (), "before2");

// 헤드 노드 앞에 삽입

flist.insert_after (flist.before_begin (), "before1");

// 단일 연결리스트 탐색

{: (flist 자동 워드)에 대한

COUT << 워드 << ENDL;

}

}

큐 큐

큐는 달성 "덱"의 사용을 밑바탕 FIFO 데이터 구조, C ++이다. 큐에 대한 자세한 내용은이의 내용을 볼 수있는  원형 큐의 그래픽 디자인을.

 

#INCLUDE <큐>

보이드 testQueue () {

<INT>의 큐;

// 팀에

s.push (1);

// 팀

s.pop ();

// 첫 번째 팀

s.front ();

// 꼬리

S.BACK ();

// 팀 크기

s.size ();

}

양단 큐의 양단

양단 팀은 머리와 꼬리 요소를 작동 할 수 있습니다. 알고리즘 설계 과정에서 우리는 덱의 덱 그래픽 디자인을했다. 

 

보이드 testDeque () {

빈 양단 큐를 초기화 //

및 <INT> my_deque;

// 두 요소를 포함하는 양단 초기화

양단 큐 <문자열> name_queue { "lefe", "WSY"};

COUT << "[0] ="<< name_queue [0] << ENDL;

// 헤드 요소를 가져옵니다

COUT << "앞 ="<< name_queue.front () << ENDL;

// 꼬리 요소를 얻을

COUT << "위로 ="<< name_queue.back () << ENDL;

// 꼬리에서 팀에

name_queue.push_back ( "BX");

name_queue.pop_front ();

}

우선 순위 큐 priority_queue

보통의 요소로 우선 순위 큐와 큐는 요소의 꼬리, 팀 헤드 삭제에 삽입 할 수 있지만, 기능 팀에 관계없이 팀 순서에 팀의 순서, 항상 가장 큰 요소의 첫 번째 우선 순위가 있습니다. 시간 복잡도는 O (logn)을 제어 할 수 있도록 "스택"을 사용하여 C ++를 바닥이 달성했다.

 

보이드 testPriorityQueue () {

우선 순위 큐를 만들기 //

priority_queue <INT> Q;

큐에 요소를 추가 //

q.push (4);

q.push (1);

대해 INT (I = 0; I는 q.size ()을 <; 내가 ++) {

COUT << q.top () << ENDL;

// 첫번째 요소를 제거

q.pop ();

}

// 큐가 비어있는 경우

q.empty ();

}

힙 힙

힙 완전한 이진 트리, 노드의 값이 부모 노드 (대형 루트 힙), 당신은 힙을 나타내는 배열을 사용할 수의 값보다 항상 큰이며, C ++는 기본적으로 큰 루트 힙입니다 제공합니다. 힙 정렬, 우리는 자세히 힙을 도입했습니다. 힙 정렬 - 정렬 6/10 보여줍니다 (제목 쓰기). 이 글에서, 우리는 쓸 힙 손을 구현 "힙을." 

스택 알고리즘을 통해 C ++에서 소개 사용법 #include <알고리즘> 필요

 

#INCLUDE <알고리즘>

보이드 testHeap () {

벡터 <INT> {번호 6, 20, 7, 3, 5};

/ ** * 판정 방법 /

// make_heap (numbers.begin () numbers.end ()는, [(INT의 B, A INT) {A <B를 반환});

// 값의 숫자 요소 힙을 생성 한 후 : 20,6,7,3,5, 대형 루트 힙

make_heap (numbers.begin () numbers.end ()는, [] (), INT의 B를 정수 (int) {A <B를 반환});

힙에 요소를 추가 //

numbers.push_back (40);

// 구조 조정 힙 : 40,6,20,3,5,7 큰 루트 힙 만들기 push_heap 이전 vertor 힙를 호출해야합니다

push_heap (numbers.begin () numbers.end ());

// 요소가 꼬리 요소 번호를 제거 할 필요가 힙의 상단을 제거 자동으로 제거되지 않습니다

pop_heap (numbers.begin () numbers.end ());

numbers.pop_back ();

}

스택 스택 

스택 후의하지 사용 양단을 달성하는 진보 된 C ++의 데이터 구조이다. 최소 스택 알고리즘을하기 전에, 우리는이 데이터 구조에 대한 세부 사항을 제시한다. 최소 스택 (LeetCode155. 최소 보여줍니다  스택) .

 

#INCLUDE <적층>

보이드 testStack () {

스택 <INT> S;

s.push (1);

s.pop ();

COUT << "상부 ="<< s.top () << ENDL;

s.size ();

}

매핑지도, unordered_map도

맵은 키와 vaule를 저장하는 데이터 구조는, 키가 고유이다. C ++은 질서지도 및 장애지도 "unordered_map도를."제공

 

#INCLUDE <unordered_map도>

사용법 #include <지도>

보이드 testMap () {

// 초기화

지도 <문자열, 문자열> m;

쌍의 <지도 <문자열, 문자열> :: 반복자, 부울> ret_iter =

m.insert (쌍 <문자열, 문자열> ( "이름", "lefe"));

경우 (ret_iter.second == false)를 {

cout과 << "이름이 존재했다"<< endl의;

}

// 초기화

지도 <INT 문자열> m2 = {

{2014, "아이폰 OS"},

{2015, "안드로이드"},

};

하나의 값을 삽입 //

m의 [ "이름"] = "WSY";

삽입 // 멀티 가치

m.insert ({{ "세", "20"}, {} "에서" "NMG"});

COUT << "사이즈 ="<< m.size () << ENDL;

반복자를 삭제 //

m.erase (m.begin ());

// 찾기

지도 <문자열, 문자열> :: 반복자 find_iter = m.find ( "에서");

{(가) (! = m.end을 find_iter) 경우

cout과 << << endl의 "를 찾아";

}

// 트래버스는, 키가 주문한

대 (쌍 <문자열, 문자열> V : m) {

COUT << v.first << "="<< v.second << ENDL;

}

모든 요소를 ​​제거 //

m.clear ();

}

저장된 값의 두 개의 쌍은 두 가지 유형의 값이 임의의 타입이 될 수는 상이 할 수있다. 제 1 및 제 2의 대응하는 값을 얻었다.

 

보이드 testPair () {

쌍 <문자열, 문자열> p = { "이름", "lefex"};

// 제 2를 통해 제 1 및 제 2 값을 구하는

COUT << p.first;

COUT << p.second;

}

튜플 튜플

이 소자의 여러 가지 종류를 저장할 수있는 확장 된 버전의 쌍이다.

 

보이드 testTuple () {

쌍 <문자열, 문자열> p = { "이름", "lefe"};

// 튜플, 유형을 생성 <strinng, INT, 더블, 쌍>

자동 my_tuple = make_tuple과 ( "이름", 20, 10.3, P);

// 첫 번째 요소를 가져옵니다

COUT << "= 0"<<하세요 <0> (my_tuple) << ENDL;

// 두 번째 요소를 가져옵니다

COUT << "1 ="<<하세요 <1> (my_tuple) << ENDL;

}

컬렉션 집합 

컬렉션은 이전 글에서, 우리는 이진 검색 트리 설정 실현 균형 이진 트리를 달성 기본에 따라, 동일한 스토리지 요소가 될 수 없습니다. BST의 사용은 설정을 실현. 또한 정렬되지 않은 집합을 제공하면서 C ++에서 세트가 주문한 "UnorderSet을." 

 

#INCLUDE은 <설정>

#INCLUDE <unordered_set>

보이드 테스트 세트 () {

설정 <INT> S {7, 3, 4};

s.insert (5);

// 3,4,5,7

{(S 자동 V)에 대한

COUT << V << ENDL;

}

 

unordered_set <INT> 우릴 {7, 3, 4};

us.insert (5);

// 7,3,4,5

{: (우리 자동차 V)에 대한

COUT << V << ENDL;

}

}

개요

우리는 C ++ 자체가 제공하는 언어, 선형 및 비선형 구조 구조의 데이터 구조를 도입했다. 이러한 데이터 구조는 다른 언어로 거의 제공하지만, 기본이되는 구현은 당신이 API Gengshuang 호출 할 때, 추가 언어가 매우 간단하게 학습, 이러한 데이터 구조 원리의 모든 것을 마스터, 기본적으로 동일합니다.

추천

출처blog.csdn.net/Abelia/article/details/93772613