lists stl
구현과 함께 STL의 목록에 대해 모두 알아보십시오.
목록은 순차 컨테이너입니다. 목록은 인접하지 않은 위치에 요소를 포함합니다. 이전 튜토리얼에서 배열과 벡터에 대해 논의했습니다.
배열 및 벡터 컨테이너의 경우 이러한 컨테이너는 연속 메모리에 데이터를 저장하므로 새 요소를위한 공간을 확보하기 위해 기존 요소를 그에 따라 이동해야하므로 이러한 컨테이너의 중간에 삽입 작업은 매우 비용이 많이 듭니다.
=> 전체 C ++ 자습서 목록을 탐색하려면 여기를 참조하십시오.
가상 현실 동영상을 찾을 수있는 곳
학습 내용 :
개요
목록은 배열 및 벡터 컨테이너의 이러한 단점을 극복 한 컨테이너입니다. 이를 통해 많은 오버 헤드없이 목록의 아무 곳에 나 요소를 삽입 할 수 있습니다. 그러나 순회에 관한 한 목록은 벡터보다 느립니다.
이 튜토리얼에서는 순회, 조작 및 예제를 통한 목록 액세스의 다양한 작업과 함께 STL의 목록 구현을 볼 수 있습니다.
대부분의 목록 작업은 벡터의 작업과 유사하므로 벡터에 대한 자습서를 이미 읽은 독자는 목록 개념을 해석하는 데 문제가 없습니다.
선언 및 초기화
목록 컨테이너를 구현하고 모든 이점을 사용하려면 프로그램에 헤더 파일을 포함해야합니다.
#include
목록 컨테이너에 대한 일반적인 선언은 다음과 같습니다.
std::list listName;
예를 들어다음과 같이 int 유형의‘mylist’라는 목록을 선언 할 수 있습니다.
std::list mylist;
선언 할 때 목록을 초기화하거나 지원하는 작업 중 하나를 사용하여 목록에 요소를 추가 할 수도 있습니다.
위에서 만든 목록을 초기화하는 방법을 살펴 보겠습니다.
std::list mylist = {1, 1, 2, 3, 5};
위의 초기화는 아래와 같이 메모리에 배치됩니다.
목록을 초기화하면 반복기를 사용하여 목록의 요소에 액세스 할 수 있습니다. Iterator 함수 'begin'및 'end'는 목록 요소를 탐색하는 데 도움이됩니다.
노트 : 목록에 대한 반복기는 역방향 반복기 (rbegin, rend), 상수 반복기 (cbegin, cend) 및 상수 역방향 반복기 (crbegin, crend)와 같은 다른 반복기를 지원하며 벡터와 유사한 방식으로 사용할 수 있습니다.
다음 예는 이것을 보여줍니다.
#include #include #include #include using namespace std; int main() { list mylist = {1, 1, 2, 3, 5}; cout<<”List elements are: “; list::iterator it; for(it=mylist.begin();it!=mylist.end();++it) cout<<*it<<” “; }
산출:
목록 요소는 다음과 같습니다. 1 1 2 3 5
따라서 위의 예에서 피보나치 수열 목록을 선언했습니다. 다음으로 list와 동일한 유형의 반복자를 선언하고 for 루프를 사용하여 목록 내용을 처음부터 끝까지 인쇄합니다.
이제 STL의 목록 컨테이너가 제공하는 작업 또는 함수로 이동하겠습니다.
목록 작업
- 끼워 넣다: 주어진 위치에 요소를 삽입하는 데 사용됩니다. 삽입 된 첫 번째 요소를 가리키는 반복기를 반환합니다.
삽입 (pos, num_elem, elem)
어디,
위치 => 새 요소를 삽입 할 위치입니다.
num_elem => 삽입 할 요소 수입니다. 기본값은 1입니다.
항목 => 삽입 할 실제 값입니다.
예제를 통해 삽입 기능을 이해하겠습니다.
#include #include // for list operations using namespace std; int main() { list mylist = {1,1,2}; list::iterator it = mylist.begin(); // iterator to point to 4th position advance(it,` 3); // inserts 3 at 4th position mylist.insert(it, 3); cout << 'The list after inserting' << ' 1 element using insert() is : '; for (list::iterator i = mylist.begin();i != mylist.end();i++) cout << *i << ' '; cout << endl; }
산출:
insert ()를 사용하여 1 개의 요소를 삽입 한 후의 목록은 다음과 같습니다. 1 1 2 3
4에 한 요소 만 삽입하는 예입니다.일결국 마지막 위치가되는 목록의 위치. 따라서 먼저 목록의 시작을 가리키는 반복자를 정의한 목록이 있습니다. 그런 다음이 반복자를 4로 이동합니다.일위치를 지정한 다음 insert를 호출하여 1 개의 요소를 삽입합니다.
삽입 함수에 두 번째 매개 변수를 지정하여 둘 이상의 요소를 삽입 할 수도 있습니다. 지정되지 않을 때마다 기본값은 1입니다.
- push_back :목록 끝에 새 요소를 추가합니다.
- push_front :목록의 시작 부분에 새 요소를 추가합니다.
push_back 및 push_front 함수의 사용법을 보여주는 예를 살펴 보겠습니다.
#include #include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 2, 3}; cout<<'List elements are: '; printlist(mylist); mylist.push_front(0); mylist.push_back(5); cout<<'
List contents after push_front and push_back: '; printlist(mylist); }
산출:
목록 요소는 다음과 같습니다. 1 1 2 3
push_front 및 push_back 이후의 내용 나열 : 012 34 5
이 예에서는 먼저 push_front 및 push_back 함수를 사용하여 앞면과 뒷면에 각각 하나씩 두 개의 요소를 모두 만들고 나열합니다. 두 함수가 모두 실행 된 후 출력에 변경된 목록이 표시됩니다.
- pop_back :목록의 마지막 요소를 제거하여 목록 크기를 1만큼 줄입니다.
- pop_front :목록에서 첫 번째 요소를 제거하여 목록 크기를 1만큼 줄입니다.
다음 예제는 목록의 pop_back 및 pop_front 작업의 사용법을 보여줍니다.
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 2, 3, 5}; cout<<'List elements are: '; printlist(mylist); mylist.pop_front(); mylist.pop_back(); cout<<'
List contents after push_front and push_back: '; printlist(mylist); }
산출:
인증 필요 사용자 이름 및 암호 라우터
목록 요소는 다음과 같습니다. 1 1 2 3 5
push_front 및 push_back 이후 내용 나열 : 1 2 3
오퍼레이션의 정의에 설명 된대로 각 오퍼레이션 pop_front 및 pop_back은 목록의 앞과 뒤에서 요소를 제거합니다. 즉, 목록의 첫 번째 요소와 마지막 요소를 각각 제거하므로 매번 목록 크기가 1 씩 줄어 듭니다.
- 크기 :목록의 크기, 즉 목록의 요소 수를 반환합니다.
- 빈 :목록이 비어 있는지 확인합니다.
- 삭제 :목록에서 요소 또는 요소 범위를 제거합니다.
- 맑은 :0 크기로 만들어 목록에서 모든 요소를 제거합니다.
아래는 위의 모든 기능 (예 : 크기, 비우기, 지우기 및 지우기)의 사용법을 보여주는 예입니다.
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 2, 3, 5}; cout<<'List elements are: '; printlist(mylist); cout<<'size of the list: '< 산출:
목록 요소는 다음과 같습니다. 1 1 2 3 5
목록의 크기 : 5
첫 번째 요소를 지운 후 목록 : 1 2 3 5
목록의 새로운 크기 : 4
삭제 후 목록 크기 : 0
위 프로그램은 목록의 용량과 관련된 네 가지 기능을 모두 보여줍니다. 목록의 1 개 요소를 지울 때 목록 크기가 1 씩 감소하는 것을 볼 수 있습니다. 목록에서 지우기 작업을 호출 할 때 크기는 0이며 이는 목록의 모든 요소가 제거되었음을 의미합니다.
- 앞 :목록의 첫 번째 요소 값을 반환합니다.
- 뒤 :목록의 마지막 요소 값을 반환합니다.
- 교환 :한 목록의 내용을 동일한 크기 및 유형의 다른 목록 내용으로 바꿉니다.
- 역전 :목록을 뒤집는 알고리즘.
- 종류 :주어진 목록을 정렬합니다.
아래 예제는 앞, 뒤, 반전, 정렬 및 스왑 기능의 사용법을 보여줍니다.
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 2, 3, 5}; cout<<'List elements are: '; printlist(mylist); cout<<'
Front of the list: '< 산출:
목록 요소는 다음과 같습니다. 1 1 2 3 5
목록 앞 : 1
목록 뒤 : 5
역 목록 : 5 3 2 1 1
홀수 목록의 내용 : 1 3 5 7 9
교환 후
mylist : 1 3 5 7 9
홀수 : 5 3 2 1 1
이 코드에서는 먼저 mylist 목록의 앞뒤 값을 인쇄합니다. 그러면이 목록이 반전되고 반전 된 목록이 인쇄됩니다. 그 후 순서가없는 홀수 목록을 하나 더 정의하고 '정렬'알고리즘을 호출하여이 목록을 정렬합니다. 그런 다음 스왑 기능을 사용하여 두 목록을 교체하고 교환 된 목록을 인쇄합니다.
- 접착 :이 함수는 한 목록의 내용을 지정된 위치의 다른 목록으로 전송하는 데 사용됩니다.
두 목록 모두 동일한 유형이어야합니다.
스플 라이스 (위치, 목록);
어디,
position => 목록 내용이 전송 될 위치.
list => 요소를 전송할 목록.
아래 주어진 예는 스플 라이스 기능의 사용법을 보여줍니다.
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 8,13}; cout<<'List elements are: '; printlist(mylist); list seclist = {2,3,5}; cout<<'list to be spliced: '; printlist(seclist); list:: iterator it = mylist.begin(); it ++; it++; mylist.splice(it,seclist); cout<<'
List contents after splicing at position 2: '; printlist(mylist); }
산출:
목록 요소는 다음과 같습니다. 1 1 8 13
접합 할 목록 : 2 3 5
2 번 위치에 접속 후 내용 나열
그만큼 예 두 개의 목록을 사용한다는 것을 보여줍니다. 먼저 mylist의 반복자를 두 위치로 이동 한 다음 splice 함수를 호출하여 두 번째 목록의 내용을 첫 번째 목록의 세 번째 위치로 전송합니다.
- 가다 :한 목록의 내용을 특정 위치에서 다른 목록으로 전송하는 데 사용할 수있는 스플 라이스 기능과 달리 병합 작업은 두 목록을 직접 병합하여 하나의 목록을 만듭니다. 병합 작업의 경우 두 목록이 모두 정렬 된 순서 여야합니다.
다음은 병합 기능을 보여주는 예입니다.
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1,2,3,5,8}; list seclist = {4,6,7}; cout<<'First List: '; printlist(mylist); cout< 산출:
첫 번째 목록 : 11 2 3 5 8
두 번째 목록 : 4 6 7
두 목록을 병합 한 후 내용 나열 :
12 34 5678
따라서 위의 프로그램에는 정렬 된 두 개의 목록이 있습니다. 이 두 목록에 대한 병합 작업을 호출합니다. 결과 목록은 두 목록의 요소를 모두 포함하는 정렬 된 목록입니다.
결론
STL의 목록에 대한이 자습서의 끝입니다. 이 튜토리얼이 STL의 목록에 대한 방대한 지식을 얻었기를 바랍니다.
=> 여기에서 C ++ 교육 자습서의 A-Z를 보려면 여기를 확인하십시오.
추천 도서