해당 함수들을 포함하는 헤더 : <array>, <deque>, <flat_map>, <flat_set>, <forward_list>, <inplace_vector>, <iterator>, <list>, <map>, <regex>, <set>, <span>, <string>, <string_view>, <unordered_map>, <unordered_set>, <vector>
template<class C>
auto begin(C& c)->decltype(c.begin()); // constexpr since C++17
template<class C>
auto begin(const C& c)->decltype(c.begin()); // constexpr since C++17
template<class T, std::size_t N>
T* begin(T (&array)[N]); // noexcept and constexpr since C++14
// T 타입의 크기 N을 가진 배열을 참조
: 컨테이너의 첫 번째 원소를 가리키는 반복자를 반환합니다.
template<class C>
auto end(C& c)->decltype(c.end()); // constexpr since C++17
template<class C>
auto end(const C& c)->decltype(c.end()); // constexpr since C++17
template<class T, std::size_t N>
T* end(T (&array)[N]); // noexcept and constexpr since C++14
: 컨테이너의 마지막 원소의 다음 위치를 가리키는 반복자를 반환합니다. 실제 원소가 있는 위치가 아닌 순차 탐색 시 탐색을 종료하는 지점을 나타냅니다.
<example>
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec = { 1, 2, 3, 4, 5 };
cout << *begin(vec) << endl;
// begin 함수는 내부에서 vec.begin()를 실행하여 반환합니다.
cout << *vec.begin() << endl;
cout << *(vec.end() - 1) << endl;
int array[5] = { 6, 7, 8, 9, 10 };
cout << *begin(array);
cout << *end(array); // Error : array의 범위를 벗어났습니다.
return 0;
}
결과값
C++14 ~
template<class C>
constexpr auto cbegin(const C& c) noexcept(noexcept(std::begin(c)))->decltype(std::begin(c));
: 컨테이너의 첫 번째 원소를 가리키는 반복자를 반환합니다. 이 반복자는 상수형(const)으로 반환되어, 원소의 수정이 불가능하도록 보장합니다.
C++14 ~
template<class C>
constexpr auto cend(const C& c) noexcept(noexcept(std::end(c)))->decltype(std::end(c));
: 컨테이너의 마지막 원소의 다음 위치를 가리키는 반복자를 반환합니다. 이 반복자는 상수형(const)으로 반환되어, 원소의 수정이 불가능하도록 보장합니다.
실제 원소가 있는 위치가 아닌 순차 탐색 시 탐색을 종료하는 지점을 나타냅니다.
noexcept(noexcept(std::begin(c))
begin(c)가 noexcept 속성을 가지고 있으면 cbegin(c)는 noexcpet 속성을 가집니다.
<example>
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec = { 1, 2, 3, 4, 5 };
auto vIt = cbegin(vec);
cout << *vIt;
*vIt = 5; // Error : 상수형(const)로 선언되어 수정이 불가능합니다.
return 0;
}
결과값
C++14 ~
template<class C>
auto rbegin(C& c)->decltype(c.rbegin()); // constexpr since C++17
template<class C>
auto rbegin(const C& c)->decltype(c.rbegin()); // constexpr since C++17
template<class T, std::size_t N>
std::reverse_iterator<T*> rbegin(T (&array)[N]); // constexpr since C++17
template<class T>
std::reverse_iterator<T*> rbegin(std::initializer_list<T> il); // constexpr since C++17
: 컨테이너의 마지막 원소를 가리키는 반복자를 반환합니다.
template<class C>
auto rend(C& c)->decltype(c.rend()); // constexpr since C++17
template<class C>
auto rend(const C& c)->decltype(c.rend()); // constexpr since C++17
template<class T, std::size_t N>
std::reverse_iterator<T*> rend(T (&array)[N]); // constexpr since C++17
template<class T>
std::reverse_iterator<const T*> rend(std::initializer_list<T> il); // constexpr since C++17
: 컨테이너의 첫 번째 원소의 앞을 가리키는 반복자를 반환합니다. 실제 원소가 있는 위치가 아닌 역방향 탐색 시 탐색을 종료하는 지점을 나타냅니다.
<example>
#include <iostream>
#include <initializer_list>
// 컨테이너의 초기화를 편리하게 할 수 있도록 도와주는 템플릿
using namespace std;
int main() {
auto il = { 10, 20, 30 }; // {} 중괄호를 이용해 초기화
// 여기서 auto는 initializer_list<int>로 추론됩니다.
auto ilIt = rbegin(il);
cout << *ilIt << endl;
for (ilIt; ilIt != rend(il); ++ilIt) { // reverse_iterator로 순회할 떄 ++를 이용합니다.
cout << *ilIt << " ";
}
cout << *rend(il); // Error : ilIt의 범위를 벗어났습니다.
return 0;
}
결과값
C++14 ~
template<class C>
auto crbegin(const C& c)-> decltype(std::rbegin(c)); // constexpr since C++17
: 컨테이너의 마지막 원소를 가리키는 반복자를 반환합니다. 이 반복자는 상수형(const)으로 반환되어, 원소의 수정이 불가능하도록 보장합니다.
C++14 ~
template<class C>
auto crend(const C& c)->decltype(std::rend(c)); // constexpr since C++17
: 컨테이너의 첫 번째 원소의 앞을 가리키는 반복자를 반환합니다. 이 반복자는 상수형(const)으로 반환되어, 원소의 수정이 불가능하도록 보장합니다.
실제 원소가 있는 위치가 아닌 역방향 탐색 시 탐색을 종료하는 지점을 나타냅니다.
<example>
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec = { 1, 2, 3, 4, 5 };
auto vIt = crbegin(vec);
cout << *vIt;
*vIt = 5; // Error : 상수형(const)로 선언되어 수정이 불가능합니다.
return 0;
}
결과값