헤더파일

C++ begin/end 본문

C++

C++ begin/end

헤더파일 2020. 3. 26. 23:28
// 컨테이너의 모든 요소를 출력하는 함수.
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