16. STL vector1
by Qerogram* vector
- STL의 컨테이너 라이브러리로써, 가장 자주 사용되는 자료구조이다.
- 배열을 대체해서 사용이 가능하다(STL list에서 설명)
- list와 매우 유사하나 중간 삽입/삭제가 안되는 단점과, 랜덤 접근이 가능하다는 장점이 있다.
(중간 삽입/삭제가 빈번한 경우 list를 활용 단, 개체가 많지 않으면 vector로 순환하더라도 성능차이는 없다.)
=> list는 iterator를 이용해 데이터에 접근을 하지만(반복문), vector는 배열과 똑같은 접근이 가능해서 훨씬 쉽다.
- 자주 검색을 해야되는 경우, map, set, hash_map등을 사용해야 된다.
- 헤더는 <vector> => #include <vector>
- 형식은 vector<자료형> 변수명; // vector<int> vector1;
- list와 마찬가지로 동적할당 가능하다.
=> vector<int>* vector1 = new vector<int>;
# 주요 멤버
- assign : 특정 element로 채운다.
- at : 특정 위치의 element의 참조를 리턴
- back : 마지막 element의 참조를 리턴
- begin : 첫 번째 element의 랜덤 접근 iterator를 리턴
- clear : 모든 element 삭제.
- empty : 아무것도 없으면 true 리턴
- end : 마지막 element 다음의(사용하지 않은 영역) iterator를 리턴.
- erase : 특정 위치의 원소나 지정 범위의 element를 삭제
- front : 첫 번째 element의 참조를 리턴.
- insert : 특정 위치에 element 삽입
- pop_back : 마지막 element 삭제
- push_back : 마지막에 element 추가
- reserve : 지정된 크기의 저장 공간을 확보
- size : element 갯수 리턴
- swap : vector의 두 원소를 서로 교환.
# 추가
1 | vector<int> vector1; vector1.push_back(1); | cs |
# 삭제
1 | vector1.pop_back(); | cs |
# 접근
- 첫 번째 위치의 iterator를 리턴. 첫 번째 element의 참조를 리턴.
1 2 3 4 | vector<int>::iterator IterBegin = vector1.begin(); cout << *IterBegin << endl; int& FirstValue = vector1.front(); const int& refFirstValue = vector1.front(); | cs |
- 마지막 위치 다음의 영역의 iterator를 리턴시 end(), 마지막 element의 참조를 리턴 시 back();
1 2 3 4 | vector<int>::iterator IterEnd = vector1.end(); for(vector<int>::iterator IterPos = vector1.begin; IterPos != vector1.end(); ++IterPos) { ... } int& LastValue = vector1.back(); const int& refLastValue = vector1.back(); | 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 | #include <iostream> #include <vector> using namespace std; struct RoomUser{ int CharCd; int Level; }; int main() { RoomUser RoomUser1; RoomUser1.CharCd = 1; RoomUser1.Level = 10; RoomUser RoomUser2; RoomUser2.CharCd = 2; RoomUser2.Level = 5; RoomUser RoomUser3; RoomUser3.CharCd = 3; RoomUser3.Level = 12; vector<RoomUser> RoomUsers; RoomUsers.push_back(RoomUser1); RoomUsers.push_back(RoomUser2); RoomUsers.push_back(RoomUser3); int UserCount = RoomUsers.size(); for(vector<RoomUser>::iterator IterPos = RoomUsers.begin(); IterPos!=RoomUsers.end(); ++IterPos) { cout << "유저코드 : " << IterPos->CharCd <<endl; cout << "유저레벨 : " << IterPos->Level << endl; } cout << endl; for(vector<RoomUser>::reverse_iterator IterPos = RoomUsers.rbegin(); IterPos!=RoomUsers.rend(); ++IterPos ) { cout << "유저 코드 : " << IterPos->CharCd << endl; cout << "유저 레벨 : " << IterPos->Level << endl; } cout << endl; for(int i = 0; i < UserCount; ++i) { cout << "유저 코드 : " << RoomUsers[i].CharCd << endl; cout << "유저 레벨 : " << RoomUsers[i].Level << endl; } cout << endl; RoomUser& FirstRoomUser = RoomUsers.front(); cout << "1번째 레벨 : " << FirstRoomUser.Level << endl; RoomUser& EndRoomUser = RoomUsers.back(); cout << "마지막 레벨 : " << EndRoomUser.Level << endl; RoomUser& RoomUserAt = RoomUsers.at(1); cout << "2번째 레벨 : " << RoomUserAt.Level << endl; RoomUsers.pop_back(); UserCount = RoomUsers.size(); cout << "현재 방에 있는 유저 : " << UserCount << endl; if( false == RoomUsers.empty()) { RoomUsers.clear(); } UserCount = RoomUsers.size(); cout << "현재 방에 있는 유저 : " << UserCount << endl; return 0; } | cs |
* 결과
유저코드 : 1
유저레벨 : 10
유저코드 : 2
유저레벨 : 5
유저코드 : 3
유저레벨 : 12
유저 코드 : 3
유저 레벨 : 12
유저 코드 : 2
유저 레벨 : 5
유저 코드 : 1
유저 레벨 : 10
유저 코드 : 1
유저 레벨 : 10
유저 코드 : 2
유저 레벨 : 5
유저 코드 : 3
유저 레벨 : 12
1번째 레벨 : 10
마지막 레벨 : 12
2번째 레벨 : 5
현재 방에 있는 유저 : 2
현재 방에 있는 유저 : 0
# vector의 insert
- list의 insert와 똑같이 3가지 방법이 있다.
(지정 위치 삽입)
(지정 위치에 지정 개수만큼 삽입)
(지정 위치에 지정 범위에 있는 것을 삽입)
- 삽입 이후, 모든 element들이 뒤로 이동하는 것을 숙지!
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 | #include <iostream> #include <vector> using namespace std; void print(vector<int> vector1) { vector<int>::iterator iterEnd = vector1.end(); for(vector<int>::iterator iterPos = vector1.begin(); iterPos!=iterEnd; ++iterPos) cout << *iterPos << endl; } int main() { vector<int> vector1; vector1.push_back(20); vector1.push_back(30); cout << "삽입 테스트 1" << endl; vector<int>::iterator iterInsertPos = vector1.begin(); vector1.insert(iterInsertPos, 100); print(vector1); cout << endl << "삽입 테스트2" << endl; iterInsertPos = vector1.begin(); ++iterInsertPos; vector1.insert(iterInsertPos, 2, 200); print(vector1); cout << endl << "삽입 테스트3" << endl; vector<int> vector2; vector2.push_back(1000); vector2.push_back(2000); vector2.push_back(3000); iterInsertPos = vector1.begin(); vector1.insert(++iterInsertPos, vector2.begin(), vector2.end()); print(vector1); return 0; } | cs |
* 결과
삽입 테스트 1
100
20
30
삽입 테스트2
100
200
200
20
30
삽입 테스트3
100
1000
2000
3000
200
200
20
30
* 참고 : Thinking About C++ STL Programming
'코딩 > C&C++' 카테고리의 다른 글
18. STL vector3 (0) | 2017.04.18 |
---|---|
17. STL vector2 (0) | 2017.04.18 |
15. STL list3 (0) | 2017.04.17 |
14. STL list2 (0) | 2017.04.16 |
13. STL list1 (0) | 2017.04.15 |
블로그의 정보
Data+
Qerogram