×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 2,312,205명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
busyhuman: 5000원(유용한 지식 감사합니다.)
익명 : 5000원(알고리즘 학습러)
반응형


알고리즘 코드를 참조하다보면  C++ STL중 하나인 vector가 보일 것이다.


배열을 넘어서서 지금부터 vector에 대해서도 알아야 한다.


처음에는 낯설고 어려워 보이지만, 쓰다보면 익숙해지고 이것만큼 편한것이 없다고 한다.


이 STL은 모르고 넘어가기 보단, 알고 응용할 줄 알면 상당히 유용할 듯하다.


int arr[100]이 일반 배열이라면

vector<int> arr;은 동적 배열이다.


예제를 통해 벡터를 배워보도록 하자.


vector<타입> 벡터명;


벡터명[0] :: 배열과 같이 이런식으로도 이용가능하다.


assign(범위, 값) :: 배열과 동일하다. 0 ~ (범위-1)만큼 "값"으로 초기화한다.


push_back(값) :: 값을 넣는다. 벡터[4]까지 있었다면 벡터[5]에 값이 들어간다.


size() :: 벡터의 사이즈를 구한다.


begin() :: 벡터의 첫번째 반복자를 반환한다.


end() :: 벡터의 마지막 반복자를 반환한다.


at(위치) :: 해당 위치의 값을 가리킨다. (arr[n]과 동일)


clear() :: 벡터에 있는 내용을 모두 지운다.




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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#include <iostream>
#include <vector> // 벡터 헤더 파일
 
using namespace std;
 
int main()
{
 
    /*
    // 1. 벡터는 객체 생성 없이 선언만으로 이용 가능하다.
     벡터는 공간 할당도 안해줘도 된다.
     객체 생성도 안해도 된다.(자바의 Scanner sc = new Scanner(System.in)
     처럼 new 를 통한 객체 생성이 필요가 없다.
     */
 
    vector<int> vc;
    vc.assign(5100);
    vc.push_back(1);
    vc.push_back(2);
 
    cout << "[1] :: vc[0] ~ vc[4]까지 assign으로 5로 할당" << endl;
    cout << "       push_back으로 vc[5] = 1, vc[6] = 2 푸쉬\n" << endl;
    for (int i = 0; i < vc.size(); i++)
        cout << vc[i] << " ";
 
    cout << "\n\n" << endl;
    
    /*
    // 2. 벡터를 초기화 하기 위해서는 vc1.assign(범위, 값) 혹은 
          vector<타입> 벡터명 = vector<타입>(범위, 값) 으로 가능하다.
     vc1 벡터의 index 0~9를 -1로 초기화
     vc1[0] ~ vc1[9] => 0
    
    */
 
    cout << "[2] :: vc1[0] ~ vc1[9]를 -1로 초기화\n" << endl;
    vector<int> vc1 = vector<int>(10-1);
 
    for (int i = 0; i < 10; i++)
        cout << vc1[i] << " ";
 
    cout << "\n\n" << endl;
 
    /*
    // 3. 벡터의 시작과 끝을 알리는 함수 vc2.begin() // vc2.end()
    이를 이용한 다른 벡터에 값 할당해주기 iterator 이용
    */
 
 
 
    cout << "[3] :: vc2 벡터를 tmp 벡터로 할당해주기 \n" << endl;
    vector<int>vc2;
    vector<int>tmp;
 
    vector<int>::iterator it0, it1;
 
    vc2.assign(51);
 
 
    it0 = vc2.begin() + 1;
    it1 = vc2.end() - 1;
 
    tmp.assign(it0, it1);
 
    cout << "vc2 원래 백터 내용 ::" << endl;
    for (int i = 0; i < vc2.size(); i++)
        cout << vc2[i] << " ";
 
    cout << "\n\n" << endl;
 
    cout << "assign으로 vc2의 벡터를 tmp 벡터로 vc2[1] ~ vc2[3] 까지만 복사한 내용 ::" << endl;
    for (int i = 0; i < tmp.size(); i++)
        cout << tmp[i] << " ";
 
 
    cout << "\n\n" << endl;
 
    /*
    // 4. 벡터에서 자주 이용되는 새로운 for문 형식
    auto :: cpp 버전에서는 알아서 형식을 판단하여 i의 형식을 정한다.
    for(auto i : vc2) :: vc2의 처음부터 끝까지를 의미
    */
 
 
    cout << "[4] :: 벡터에서 자주 이용되는 for문 형식 :: for(auto i : 벡터명) \n" << endl;
    vector<int> vc3 = vector<int>(100,10);
 
    for (auto i : vc3)
        cout << vc3[i] << " ";
 
 
    cout << "\n\n" << endl;
 
 
 
 
    /*
    // 5. 배열을 벡터로, 벡터를 배열로
    배열 값을 벡터에 넣을 수도 있고, 벡터 값을 배열에 넣을 수도 있다.
    */
 
 
    cout << "[5] :: 배열을 벡터로 복사, 벡터를 배열로 복사해보기\n" << endl;
 
    char arr[11= "hello";
    
    vector<char> vc4;
 
    cout << "배열 \"hello\"를 벡터로 복사 \n" << endl;
    vc4.assign(arr, arr + sizeof(arr) / sizeof(char));
    
    for (int i = ; i <  vc4.size() ; i++)
        cout << vc4[i] << " ";
 
 
    // 벡터명.clear()을 이용하면 벡터를 지울 수 있다.
    vc4.clear();
 
    vc4.push_back('w');
    vc4.push_back('o');
    vc4.push_back('r');
    vc4.push_back('l');
    vc4.push_back('d');
 
 
 
    cout << "\n\n벡터에 push_back을 순차적으로 하여 world를 넣고 배열에 옮겨보기\n" << endl;
 
    arr[5= vc4[0];
    arr[6= vc4[1];
    arr[7= vc4.at(2);
    arr[8= vc4.at(3);
    arr[9= 'd';
    arr[10= '\0';
 
    cout << arr;
 
 
    cout << "\n\n" << endl;
 
    /*
    // 6. 벡터에서 알수 없는 오류
    필자는 잘모르겠다. 아는 분이 있으면 알려줬으면 한다...
    vector<int>(범위, 값)에서
    
    값이 범위보다 같거나 크면 에러이다.
    즉, (100,99)까지 가능하고 (100,100)을 넣으면 출력 시 에러가 난다.
    이유는 모르겠다..
    */
 
 
    cout << "[6] :: 벡터의 의문점.. (주석을 통해 달아두었습니다.)\n" << endl;
    vector<int> vc6 = vector<int>(10099);
 
    cout << "vc6은 통과합니다. 출력이 잘 됩니다." << endl;
 
    for (int i : vc6) // 결국 auto i는 int와 같다는 것이다.
        cout << vc6[i] << " ";
 
 
    cout << "\n\n" << endl;
 
 
 
    vector<int> vc7 = vector<int>(100100);
 
 
    cout << "vc7은 통과하지 못하고 에러가 납니다.(출력이 안됩니다.)" << endl;
 
    for (auto i : vc7)
        cout << vc7[i] << " ";
 
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus









 


이 코드를 그대로 돌리면 마지막 vc7의 for문 때문에 오류가 나게된다.


반응형
  1. 으앙 2017.03.04 14:35

    for(auto i : vc7) // i 에 vc7[i] 값이 바로 할당됩니다
    cout << vc[i] << " ";

    /*
    (10,9)으로 초기화 되어 있다고 가정했을때
    for문을 돌리면 vc[vc[0]] , vc[vc[1]], ... ,vc[vc[9]] --> vc[9], vc[9], ... , vc[9]
    (10,10)이면
    vc[vc[0]]가 vc[10]이 되어 범위 밖 참조로 에러가 나옵니다
    */