너무 오래 데이터 구조 및 알고리즘에 대한 학교, 요약, 우리는이 시간 동안 학습 결과를 보는 방식에 올 필요가있다. 데이터 구조 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 호출 할 때, 추가 언어가 매우 간단하게 학습, 이러한 데이터 구조 원리의 모든 것을 마스터, 기본적으로 동일합니다.