[C++, STL] vector, deque, list container 정리 및 사용 방법 알아보기 (벡터, 데크, 리스트, 자료구조)
프로그래밍/C++ 2020. 2. 10. 12:27STL(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[] = { 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); // 첫 번째 원소 삭제 //-크기 확인하는 방법 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[] = { 0, 1, 2, 3, 4 }; 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 |
'프로그래밍 > C++' 카테고리의 다른 글
[C] 변수 크기, 변수 입/출력하기(char, int, print, scanf) (0) | 2019.06.25 |
---|---|
[C++] socket 추가 및 사용하기 (윈도우 소켓) (0) | 2019.01.28 |