본문 바로가기
프로그래밍/C++

[C++, STL] vector, deque, list container 정리 및 사용 방법 알아보기 (벡터, 데크, 리스트, 자료구조)

by GhostWeb 2020. 2. 10.
반응형


STL(Standard Template Library)의 자료구조, 알고리즘을 이용할 수 있는 라이브러리로 자료를 보관할 수 있는 컨테이너에 대해서 알아보도록 할게요.


vector (벡터)


- 동적 배열(Dynamic Array)로 추가 시 배열의 크기를 신경안써도 됨

- 배열처럼 사용 가능 (ex : a[0] = 1;)

- 템플릿 형식


- include

#include <iostream>

#include <vector>

using namespace std;



- 선언

vecotor<int> data;

vecotor<int> data1() {0, 1, 2, 3, 4};

vecotor<int> data2(5); // 5개 크기로 선언


int iArray[] = { 0, 1, 2, 3, 4 };

vector<int> data2(iArray, iArray + 2); // 0, 1

vector<int> data3(data2); // 0, 1



- 추가/삭제

data.push_back(1); // 맨 뒤에 1 추가, 크기+1

data.pop_back(); // 맨 뒤의 요소 제거, 크기-1



- 삽입

data.insert(data.begin(), 0); // 첫 부분에 원소 삽입



- 삭제

data.erase(data.begin(), data.begin()+1); // 첫 번째 원소 삭제



- 크기 확인하는 방법

data.size();



- 접근, 출력

data.push_back(0);

data[0] = 2;

cout << "data[0] : " << data[0] << endl; // 출력



- 전체 출력

// size 이용

for (int i = 0; i < (int)data2.size(); i++)

{

cout << data2[i] << endl;

}


// 반복자(iterator) 이용

vector<int>::iterator it;

for (it = data2.begin(); it < data2.end(); it++)

{

cout << *it << endl;

}


data.begin() : 첫 번째 요소의 반복자 위치

data.end() : 마지막 요소 다음의 위치 (NULL)



- 비교

int iArray1[] = { 0, 1, 2, 3, 4 };

vector<int> vec1(iArray1, iArray1 + 5);

vector<int> vec2(vec1);


if(vec1 == vec2)

cout << "같음" << endl;

else

cout << "다름" << endl;





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <vector>
#include <iostream>
using namespace std;
 
int main()
{
    vector<int> data;
    vector<int> data1(5); // 5개 크기로 선언
 
    int iArray[] = { 01234 };
    vector<int> data2(iArray, iArray + 2);    // 0, 1
    vector<int> data3(data2);  // 0, 1
 
    //-추가 / 삭제
    data.push_back(1); // 맨 뒤에 1 추가, 크기+1
    data.pop_back(); // 맨 뒤의 요소 제거, 크기-1
 
//-삽입
    data.insert(data.begin(), 0); // 첫 부분에 원소 삽입
 
//-삭제
    data.erase(data.begin(), data.begin() + 1); // 첫 번째 원소 삭제
 
//-크기 확인하는 방법
    cout << "size : " << data.size() << endl;
 
//-접근, 출력
    data.push_back(0);
    data[0= 2;
    cout << "data[0] : " << data[0<< endl// 출력
 
    //-전체 출력
    // size 이용
    for (int i = 0; i < (int)data2.size(); i++)
    {
        cout << data2[i] << endl;
    }
 
    // 반복자(iterator) 이용
    vector<int>::iterator it;
    for (it = data2.begin(); it < data2.end(); it++)
    {
        cout << *it << endl;
    }
 
    //data.begin() : 첫 번째 요소의 반복자 위치
    //data.end() : 마지막 요소 다음의 위치(NULL)
 
//    - 비교
    int iArray1[] = { 01234 };
    vector<int> vec1(iArray1, iArray1 + 5);
    vector<int> vec2(vec1);
 
    if (vec1 == vec2)
        cout << "같음" << endl;
    else
        cout << "다름" << endl;
}
cs


- 컨테이너 멤버 함수


 push_back(value)

 맨 뒤에 값 추가, 크기+1

 pop_back()

 맨 뒤의 마지막 값 삭제, 크기-1

 

 intsert(iterator, value)

 해당 위치에 값 삽입

 earse(iterator)

 해당 위치의 요소 삭제

 earse(iterator1, iterator2)

 지정된 범위 삭제

 

 begin()

 첫 번째 요소 반복자 위치

 end()

 마지막 요소 다음 위치

 rbegin() 

 끝을 가르키는 역반복자

 rend()

 역반복자의 맨 앞을 지난 위치

 

 size()

 컨테이너의 크기

 front()

 첫 번째 값 반환

 clear()

 모든 값 삭제

 empty()

 컨테이너가 비어있나 확인 (true, false)




deque(데크)

- 동적 배열

- 맨 앞, 맨 뒤에 원소 추가, 삭제 가능



- include

#include <deque>

using namespace std;


- 선언

deque<int> dqData;



- 삽입

dqData.push_back(1); // 1 맨뒤 추가 - 1

dqData.push_back(2); // 2 맨뒤 추가 - 1, 2

dqData.push_front(0); // 0 맨앞 추가 - 0, 1, 2



- 삭제

dqData.pop_front(); // 맨뒤 원소 삭제 - 0, 1

dqData.pop_back(); // 맨앞 원소 삭제 - 1



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <deque>
using namespace std;
 
int main()
{
   // 선언
    deque<int> dqData;
 
    // 삽입
    dqData.push_back(1);  // 1 맨뒤 추가 - 1
    dqData.push_back(2);  // 2 맨뒤 추가 - 1, 2
    dqData.push_front(0); // 0 맨앞 추가 - 0, 1, 2
    
    // 출력
    for(int i = 0; i < (int)dqData.size(); i++)
    {
        cout << dqData[i] << endl;
    }
 
    cout << "------------------------" << endl;
 
    // 삭제
    dqData.pop_front();  // 맨뒤 원소 삭제 - 0, 1
    dqData.pop_back();   // 맨앞 원소 삭제 - 1
 
    // 출력
    for (int i = 0; i < (int)dqData.size(); i++)
    {
        cout << dqData[i] << endl;
    }
}
cs




list (리스트)

- 이중 연결 리스트

- 삽입, 삭제가 빈번한 경우 효율적

- 반복자로 양방향 이동 가능

- 임의 접근 불가능 (iData[0] ← X)



- include

#include <list>

using namespace std;



- 선언

list<int> listData;



- 추가

listData.push_back(0); // 맨뒤에 0 추가 - 0

listData.push_back(2); // 맨뒤에 2 추가 - 0, 2



- 삽입

listData.insert(++listData.begin(), 1); // 시작+1 위치에 1 추가 - 0, 1, 2



- 삭제

listData.erase(listData.begin()); // 0 번째 요소 삭제 - 1, 2



- 출력

list<int>::iterator it;

for (it = listData.begin(); it != listData.end(); it++)

{

   cout << *it << endl;

}



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <list>
using namespace std;
 
int main()
{
    // 선언
    list<int> listData;
 
    // 추가
    listData.push_back(0); // 맨뒤에 0 추가 - 0
    listData.push_back(2); // 맨뒤에 2 추가 - 0, 2
 
    // 삽입
    listData.insert(++listData.begin(), 1);  // 시작+1 위치에 1 추가 - 0, 1, 2
 
    // 출력
    list<int>::iterator it;
    for (it = listData.begin(); it != listData.end(); it++)
    {
        cout << *it << endl;
    }
 
    cout << "-------------------------" << endl;
 
    // 삭제
    listData.erase(listData.begin()); // 0 번째 요소 삭제 - 1, 2
 
    // 출력
    for (it = listData.begin(); it != listData.end(); it++)
    {
        cout << *it << endl;
    }
}
cs




반응형