c++에는 vector 라는 자료구조가 있는데, vector의 begin()과 end() 함수에 대해 우리가 자주 할 수 있는 실수에 대해 이야기해보려 한다. (알고리즘 문제를 풀다가, reverse() 함수를 쓸 일이 생겼는데, reverse(v.begin()+숫자, v.end()) 이게 도대체 어디서부터 어디까지를 거꾸로 전환하는지 갑자기 헷갈려서 찾아봤다.)
vector 의 begin()이란 함수는 cplusplus.com 에 따르면, 'Returns an iterator pointing to the first element in the vector', 즉 벡터의 첫 번째 원소를 가리키는 iterator를 반환한다 라고 나와있다.
그렇다면, 많은 사람들이 'end() 함수는 그럼 벡터의 마지막 원소를 가리키는 iterator를 반환하겠네?' 라고 생각할 수 있지만, 아니다.
end() 함수는 cplusplus.com에 'Returns an iterator referring to the past-the-end element in the vector container. The past-the-end element is the theoretical element that would follow the last element in the vector. It does not point to any element, and thus shall not be dereferenced' 라고 나와있다.
다시 말해 end() 함수는 벡터 컨테이너 안의 past-the-end 원소를 가리키는 iterator를 반환하고, 여기서 past-the-end 원소란 벡터의 마지막 원소 다음으로 오는 이론상의 원소로서, 역참조될 수 없다 라고 한다.
따라서, end()는 벡터의 마지막 원소가 아닌, 마지막 원소 다음으로 오는, 이론상의 원소를 가리키는 iterator를 반환한다 정도로 이해하면 될 것 같다.
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MX = 3500;
int n, m;
vector <int> v;
int main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
for(int i = 1; i <= 5; i++){
v.push_back(i);
}
// v = {1,2,3,4,5};
vector <int>::iterator iter;
for(iter = v.begin(); iter < v.end(); iter++){
cout << *iter << ' ';
}
cout << '\n';
// 1 2 3 4 5
}
이 예제에서 볼 수 있듯이, 반복문에 vector <int>의 iterator가 end()를 만나면 종료되도록 했다. 반복문의 첫 번째 반복자는 begin()이 할당되어 있고, 이는 벡터의 첫 번째 원소, 1을 가리키는 것을 볼 수 있다. 그리고 반복문은 end()의 바로 직전인 마지막 원소 5를 출력하고 마지막 end()를 만나 종료된다.
'Algorithm' 카테고리의 다른 글
[2023 서강대학교 청정수컵] 청정수 Round 짧 후기 (6) | 2023.05.22 |
---|---|
[알고스팟/c++] Sorting Game SORTGAME 문제 풀이 (0) | 2021.07.28 |
[알고스팟/c++] 고대어 사전 DICTIONARY 문제 풀이 (0) | 2021.07.27 |
[알고스팟/c++] 게임판 덮기 BOARDCOVER 문제 풀이 (0) | 2021.07.25 |