C++ STL(Standard Template Library) 에서 제일 중요한 라이브러리 두가지가 있는데 그것이 <vector> 과 <map> 이다.
이중에 vector에 대하여서 정리를 해야할것같아서 올려본다.
● vector STL(Standard Template Library)
▲ 무기로 사용되는 "Vector"
요즘들어서 vector 벡터 하면 떠오르는 것이 "배틀그라운드" 에 등장하는 총의 종류다. ㅎㅎ 헛소리는 여기까지 하고 넘어가자.
벡터라는 단어의 사전적인 뜻은 "크기와 방향으로 정해지는양" , "(질병의 )매개체" , "(비행기의)진로" 명시되어있다.
프로그래밍적으로도 사용되고 수학적인 개념으로도 사용된다. 우리는 프로그래밍적으로 접근할 것이다.
C++에서 사용하는 STL으로써 스택의 구조와 유사하기도 하고 단일 연결리스트와도 유사한 배열의 구조라고 할 수 있다. 배열(리스트)와는 다른점이 있기 때문에 사용하는 목적에 따라서 "vector"을 사용할 것인지 "list"를 사용할 것 인지 결정하게 된다.
vector<[자료형]> [변수이름]
기본적으로 vector의 선언방식은 이러하다.
● vector 주요 함수들
생성자 |
|
vector v |
비어있는 vector 생성 |
vector v(n) |
n개의 요소가 있는 v |
vector v(n,data) |
data로 초기화된 n개의 원소를 가지는 v |
vector v(v2) |
v에 v2 를 복사하여 생성 |
v.assign(n,m) - n개의 요소에 m 값을 초기화한다.
v.at(i) - v의 i번째 요소를 참조한다.
v.front() - 첫번째 요소를 참조한다.
v.end() - 마지막 요소를 참조한다.
v.push_back(n) - 마지막 요소 다음에 n의 값을 넣는다.
v.pop_back() - 마지막 요소를 제거한다.
it = v.begin() - it는 v의 첫번째 요소를 가르는 반복자. iterator과 사용한다.
it = v.end() - it는 v의 마지막 요소를 가르키는 반복자. iterator과 사용한다.
it = v.rbegin() - it는 v의 역순차의 첫번째 요소를 가르키는 반복자.
it = v.rend() - it는 v의 역순차의 마지막 요소를 가르키는 반복자.
v.reserve(n) - n개의 원소를 저장할 공간을 예약한다.(미리 동적할당 해두는것) 추가할당 하는것이 아니다.
v.resize(n) - v의 크기를 n개만큼 변경하고 확장된 공간의 값을 default값인 0으로 초기화한다. capacity는 그대로이다.
v.resize(n,data) - v의 크기를 n개만큼 변경하고 확장된 공간의 값을 data값으로 초기화한다. capacity는 그대로이다.
v.size() - v의 원소의 개수를 리턴한다.
n = v.max_size() - n은 v가 담을 수 있는 최대 요소의 개수를 가진다.
n = v.capacity() - v의 요소가 할당된 공간의 크기를 리턴한다.
v.swap(v1) - v1와 v 를 서로 바꿔준다. capacity()도 바뀐다.
v.insert(p,n,x) - p가 가리키는 위치에 n개의 x값을 삽입한다.
q = v.insert(p,x) - p가 가리키는 위치에 x값을 삽입한다. q는 삽입한 원소를 가르키는 반복자.
q = v.erase(p) - p가 가리키는 원소를 제거한다 q는 다음 원소를 가르킨다. capacity는 남아있다.
v.empty() - v가 비어있는지 확인한다.
v.clear() - v의 모든요소를 제거한다. capacity는 그대로 남아있다.
v1 == v2 - v1과v2의 모든 원소가 값은가?
v1 != v2 - v1과v2의 모든 원소중 하나라도 다른것이 있는가?
v1 < v2 - 문자열처럼 비교하여 v1이 v2보다 작은가?
v1 > v2 - 문자열처럼 비교하여 v1이 v2보다 큰가?
▷ 맴버형식
iterator - 반복자형식
reverse_iterator - 역반복자형식
value_type - 원소의 형식 int
size_type - 원소의 개수의 형식 unsigned int
1 2 3 4 | vector<int>::size_type i1; vector<int>::iterator i2; vector<int>::value_type i3; vector<int>::reverse_iterator i4; | cs |
▲ 맴버형식의 자료형
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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | // vector<[dataType]> [변수이름] vector<int> v1; // 비어있는 vector을 생성 vector<int> v2(5); // 기본값(0)으로 초기화된 5개의 원소를 가지는 vector vector<int> v3(5,2); // 2로 초기화된 5개의 원소를가지는 vector vector<int> v4(v3); // v4는 v3 vector을 복사해서 생성한다. // Vector은 내부에 인자가 있다고 할때, 연산자 "==", "!=", "<", ">", "<=",">=" 로 비교가 가능하다. ////////////////////////////// for(int i=0; i< 5; i++) ////// 설명을 위해 인자를 넣어준다. v1.push_back(i); ////// ////////////////////////////// // 맴버함수 v1를 기준으로 // assign 문법적으로 맡기다라는 뜻 어사인 v3.assign(5,2); // 선택한 인덱스의 원소를 참조한다. 속도는 느리지만 범위를 점검하기에 안전함 for(int i=0; i< 5; i++) cout << v1.at(i) << " "; cout << endl; // 출력결과 - 0 1 2 3 4 // 범위를 점검하지 않으므로 속도는 빠르다. for(int i=0; i< 5; i++) cout << v1[i] << " "; cout << endl; // 출력결과 - 0 1 2 3 4 // 첫번째요소와 마지막 요소를 참조한다. cout << v1.front() << endl; cout << v1.back() << endl; // 출력결과 - 0 // 출력결과 - 4 // 마지막 원소뒤에 요소 '7'을 추가한다. v1.push_back(5); // 마지막 원소 뒤에 요소를 제거한다. v1.pop_back(); // 첫번째 요소를 가리킨다. iterator와 사용 v1.begin(); // 마지막의 다음요소를 가르킨다. iterator 와 사용 v1.end(); // reverse begin을 가르킨다. 거꾸로해서 첫번째 원소를 가리킨다. iterator와 사용 v1.rbegin(); // reverse end을 가르킨다. 거꾸로 해서 마지막 의 다음을 기르킨다.iterator와 사용 v1.rend(); // n개의 원소를 저장할 위치를 예약한다. ( 미리 동적할당 해놉니다.) v1.reserve(10); // 크기를 변경한다. 더 켜졌을 경우 default값인 0으로 초기화한다. v1.resize(20); // 원소의 갯수를 리턴한다. v1.size(); // 할당된 공간의 크기를 리턴한다. v1.capacity(); // 단어의 뜻은 용량 size와를 다르다. size는 할당된 메모리안의 요소가 들어있는개수 // capacity는 할당된 메모리의 갯수 크기 // 원소를 서로 바꿔준다. capacity도 바꿔준다. v1.swap(v3); // vector가 비어있다면 true리턴 비어있다는 기준은 size가 0이라는 뜻이다. v1.empty(); // 요소를 정리한다. 원소만 제거하고 메모리는 남아있다. v1.clear(); | cs |
● vector 사용 예제
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 | #include <stdio.h> #include <iostream> #include <vector> // 벡터사용을 위한 헤더파일 추가 using namespace std; int main() { vector<int> v; v.push_back(10); v.push_back(20); v.push_back(30); v.push_back(40); v.push_back(50); v.push_back(60); for(vector<int>::size_type i = 0; i < v.size(); i++) cout << v[i] << endl; cout << endl; cout << "size:"<< v.size() << endl; cout << "capacity:"<<v.capacity() << endl; cout << "max_size:"<<v.max_size() << endl; return 0; } | cs |
출력결과
10
20
30
40
50
60
size:6
capacity:6
max_size:1073741823
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | v.resize(10); for(vector<int>::size_type i=0; i<v.size(); i++) cout << v[i] << endl; cout << "size:"<< v.size() << endl; cout << "capacity:"<<v.capacity() << endl; cout << "max_size:"<<v.max_size() << endl; cout << endl; v.clear(); cout << "size:"<< v.size() << endl; cout << "capacity:"<<v.capacity() << endl; cout << "max_size:"<<v.max_size() << endl; | cs |
출력결과
10
20
30
40
50
60
0
0
0
0
size:10
capacity:10
max_size:1073741823
size:0
capacity:10
max_size:1073741823
● 백터를 사용해야하는 경우
1. 저장할 데이터 개수가 가변적일 경우
2. 중간에 데이터 삽입이나 삭제가 없을 경우
아직 잘 모르겠다. 실전으로 사용해본 경험이 많이 없기 때문에, 틈틈히 사용해보고 필요하다는것을 몸소 느끼고 추가로 작성해야겠다.
'훈, IT 공부 > C,C++,MFC' 카테고리의 다른 글
[MFC] 각클래스 객체 포인터 얻어오기 (0) | 2018.04.28 |
---|---|
[MFC]Document Template (0) | 2018.04.28 |
[프로그램]강아지와 병아리 ( 다리개수 ) +손코딩연습 (0) | 2018.02.28 |
[C/C++] C++에서의 클래스와(Class) C언어 에서의 구조체 비교해보자 (0) | 2018.01.31 |
[프로그램]복권(로또)게임 #랜덤으로 뽑기(자동) (0) | 2018.01.30 |
댓글