Notice
Recent Posts
Recent Comments
Link
헤더파일
C++ begin/end 본문
// 컨테이너의 모든 요소를 출력하는 함수.
template<typename T> void show(T& c)
{
// auto p1 = c.begin();
// auto p2 = c.end();
auto p1 = begin(c);
auto p2 = end(c);
while (p1 != p2)
{
cout << *p1 << endl;
++p1;
}
}
int main()
{
list<int> c = { 1,2,3 };
//vector<int> c = { 1,2,3 };
show(c);
int x[3] = { 1,2, 3 };
show(x);
}
stl의 begin/end 함수의 경우 stl 컨테이너 뿐만 아니라 배열도 지원합니다. 좀 더 제네릭한 코드를 위해 일반함수를 사용하는 형태가 좋습니다. 엄격하게는 #include<iterator>를 넣어줘야합니다.
c++14부터는 cbegin, rbegin 같은함수도 지원합니다.
// container version.
template<typename C>
constexpr auto begin(C& c) -> decltype(c.begin())
{
return c.begin();
}
template<typename C>
constexpr auto end(C& c) -> decltype(c.end())
{
return c.end();
}
// arr version
template<typename T, std::size_t N>
constexpr T* begin(T(&arr)[N])
{
return arr;
}
template<typename T, std::size_t N>
constexpr T* end(T(&arr)[N])
{
return arr + N;
}
int main()
{
list<int> s = { 1,2,3 };
int x[3] = { 1,2,3 };
auto p1 = begin(s);
auto p2 = begin(x);
}
내부적으로는 이렇게 만들어져 있는데 auto ... ->decltype(c.begin()) 문법은 리턴값을 후위에 표현할 수 있는 문법입니다. c.end 리턴값이 앞에 있을 경우 C가 아직 판단되지않아 오류가 나기 때문에 이런식으로 적어야합니다.
size_t N 은 배열이 왔을 때 배열의 크기를 얻을 수 있는 템플릿 문법입니다.
'C++' 카테고리의 다른 글
C++ static_assert (0) | 2020.03.26 |
---|---|
c++ Brace Init (0) | 2020.03.25 |
C++ Explicit Conversion Operator (0) | 2020.03.25 |
c++ 변환 연산자, 변환 생성자 (0) | 2020.03.23 |
C++17 if 초기화, if constexpr, 구조체 바인딩 (1) | 2020.03.23 |
Comments