'C++' std::begin, std::end, std::cbegin, std::cend, std::rbegin, std::rend, std::crbegin, std::crend

토스트·2024년 12월 25일
0

'C++' basic

목록 보기
12/35

해당 함수들을 포함하는 헤더 : <array>, <deque>, <flat_map>, <flat_set>, <forward_list>, <inplace_vector>, <iterator>, <list>, <map>, <regex>, <set>, <span>, <string>, <string_view>, <unordered_map>, <unordered_set>, <vector>

정방향

begin

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을 가진 배열을 참조

: 컨테이너의 첫 번째 원소를 가리키는 반복자를 반환합니다.

end

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;
}

결과값

상수형 정방향

cbegin

C++14 ~

template<class C>
constexpr auto cbegin(const C& c) noexcept(noexcept(std::begin(c)))->decltype(std::begin(c));

: 컨테이너의 첫 번째 원소를 가리키는 반복자를 반환합니다. 이 반복자는 상수형(const)으로 반환되어, 원소의 수정이 불가능하도록 보장합니다.

cend

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;
}

결과값

역방향

rbegin

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

: 컨테이너의 마지막 원소를 가리키는 반복자를 반환합니다.

rend

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;
}

결과값

읽기 전용 역방향

crbegin

C++14 ~

template<class C>
auto crbegin(const C& c)-> decltype(std::rbegin(c)); // constexpr since C++17

: 컨테이너의 마지막 원소를 가리키는 반복자를 반환합니다. 이 반복자는 상수형(const)으로 반환되어, 원소의 수정이 불가능하도록 보장합니다.

crend

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;
}

결과값

0개의 댓글