야금야금

[C++] STL 컨테이너 정리(1)_순차 컨테이너 본문

Algorithm

[C++] STL 컨테이너 정리(1)_순차 컨테이너

hyk0425 2021. 3. 30. 23:10

순차 컨테이너

: 자료를 순차적으로 가지고 있으며 자료의 추가는 빠르지만 탐색의 경우 시간이 많이 걸린다.


vector

: 동적 배열처럼 동작하며 뒤에서 자료들이 추가된다.

 

- 자료의 추가 시 배열의 크기나 타입을 신경 쓰지 않아도 된다.

- 저장할 데이터의 개수가 가변적일때 사용한다.

- 편리성을 위해 연산자들이 중복 정의되어있어 대입 연산(v2 = v1), 비교 연산(v1!= v2 / v1 == v2) 등이 사용 가능하다.

- 임의접근 반복자를 사용할 수 있다. (인덱스 연산자 [ ] 사용 가능)

- 중간에서 데이터의 삽입이나 삭제가 가능하지만 뒤의 모든 요소를 이동해야 하므로 비효율적이다.

- 크기를 미리 선언하지 않아도 되지만 위와 같은 이유로 비효율적이다.

 

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> v1;     	// int 자료형의 동적 배열 v1 생성
    vector<int> v2(10); 	// 크기가 10인 동적 배열 v2 생성 // 기본적으로 원소는 모두 0으로 초기화
    vector<int> v3(10, 1); 	// 크기가 10인 동적 배열 v3 생성, 모든 원소를 1로 초기화
    vector<int> v4(v3); 	// v3를 복사해서 v4 생성
    
    v1.push_back(4);    // v1마지막에 원소 4를 추가
    v1.pop_back();      // v1의 마지막 원소 삭제
    
    cout<<v2.size()<<endl;  // v2의 크기 출력
    v2.resize(5);       // v2의 크기 변경
    
    cout<<v3.front()<<v3[n]<<v3.back()<<endl;  //v3의 첫번째, n번째, 마지막 원소 출력
    v3.begin();         // v3의 첫번째 원소의 iterator 반환
    v3.end();           // v3의 마지막 원소의 '다음' iterator 반환
    v3.erase(v3.begin());   //v3의 첫번째 원소 삭제
    
    vector<int>::iterator iter = v4.begin();
    v4.erase(iter + a -1, iter + b -1); // v3의 [a, b)의 원소 삭제 //v3.erase(v3[a], v3[b])이거 아님
    sort(v4.begin(), v4.end());  	//오름차순으로 정렬 // v4.sort()이거 아님
    v4.clear(); 		//v3의 모든 원소 삭제, 메모리는 그대로
    
    return 0;
}

 


list

: 이중연결리스트로 구현된다. 리스트의 양 끝에서 삽입 삭제가 가능하다.

 

- 벡터와 달리 중간에서 효율적으로 데이터의 삽입·삭제를 할 수 있다.

- 반복자(iterator)를 통해 양방향 이동이 가능하다.

- 인덱스 연산자를 지원하지 않는다. 따라서 어떤 요소에 접근하기 순차적으로 양방향 반복자(++, --)를 사용하여 접근해야 한다. 따라서 검색을 자주 할 경우 비효율적이다.

- 임의 접근 반복자를 필요로 하는 binary_search()와 같은 알고리즘은 적용할 수 없다.

- 각 데이터마다 링크를 저장해야하여 메모리를 더 많이 차지한다.

 

#include <iostream>
#include <list>
using namespace std;

int main() {
    list<int> l1;           // int 자료형의 리스트 l1 생성
    list<int> l2(10);       // 크기가 10인 리스트 l2 생성 // 기본적으로 원소는 모두 0으로 초기화
    list<int> l3(10, 1);    // 크기가 10인 리스트 v3 생성, 모든 원소를 1로 초기화
    list<int> l4(l3);       // l3를 복사해서 l4 생성
    
    l1.push_back(4);    // l1 마지막에 원소 4를 추가
    l1.pop_back();      // l1의 마지막 원소 삭제
    l1.push_front(3);   // l1의 시작에 원소 3을 추가
    l1.pop_front();     // l1의 첫 원소 삭제
    
    
    cout<<l2.size()<<endl;  // l2의 크기 출력
    l2.reverse();       // l2 순차열 뒤바꿈
    
    cout<<l3.front()<<l3.back()<<endl;  //l3의 첫번째, 마지막 원소 출력
    l3.begin();         // l3의 첫번째 원소의 iterator 반환
    l3.end();           // l3의 마지막 원소의 '다음' iterator 반환
    
    list<int>::iterator iter = l4.begin();
    l4.insert(iter, 25);    // iter가 가리키는 곳에 25를 삽입
    iter=l4.erase(iter);// iter가 가리키는 원소 삭제 후 다음 원소 주소 반환
    l4.sort();  	//오름차순으로 정렬
    l4.clear(); 	//v3의 모든 원소 삭제, 메모리는 그대로
    
    return 0;
}

'Algorithm' 카테고리의 다른 글

[C++] STL (Standard Template Library) 이란?  (0) 2021.03.30