auto it = std::find(values.cbegin(), values.cend(), 1983);
values.insert(it, 1998);
C++에서 begin
과 end
같은 비멤버 함수 버전을 멤버 함수보다 선호하는 것은 주로 코드의 일관성, 유연성, 그리고 일반성을 높이기 위해 나온 관습임
std::begin
과 std::end
같은 비멤버 함수를 지원함std::vector<int> vec = { 1, 2, 3 };
auto it = std::begin(vec); // 비멤버 함수 사용
auto it = vec.begin(); // 멤버 함수 사용
만약 멤버 함수만 사용한다면 특정 컨테이너나 클래스에 따라 begin()
, cbegin()
, rbegin()
등을 명시적으로 호출해야 함
비멤버 함수를 사용하면 이러한 호출 방식의 차이를 줄이고, STL 스타일의 함수 호출 패턴을 유지할 수 있음
std::begin
과 std::end
는 사용자 정의 타입에도 적용될 수 있도록 설계됨std::begin
과 std::end
를 오버로드하면 STL과 동일하게 동작할 수 있음struct CustomContainer
{
int data[3] = { 1, 2, 3 };
int* begin() { return &data[0]; }
int* end() { return &data[3]; }
};
CustomContainer c;
for (auto it = std::begin(c); it != std::end(c); ++it)
{
std::cout << *it << " "; // 1 2 3
}
여기서 std::begin
과 std::end
을 사용하면 내부적으로 적절한 멤버함수를 호출해주므로 STL과 사용자 정의 컨테이너 간의 일관성을 유지할 수 있음
int arr[] = { 1, 2, 3 };
auto it = std::begin(arr); // arr의 시작 주소 반환
auto end_it = std::end(arr); // arr의 끝 주소 반환
반면 멤버 함수는 이런 원시 타입에서 사용할 수 없음