Data+

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;
  
  iffalse == 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, 2200);
  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

활동하기