포인터의 의미는 (알렉산더 스테파노 프의의 기반으로 C ++ 표준 라이브러리의 뒤에 디자인 철학의 기본적인 측면 반영하기 때문에 포인터를 증가 시켜도, 관용적 C ++입니다 STL를 )
여기서 중요한 개념은 STL이 컨테이너, 알고리즘 및 반복자를 중심으로 설계되었다는 것입니다. 포인터는 단순히 반복자 입니다.
물론, 포인터를 증가 (또는 더하기 / 빼기)하는 기능은 C로 돌아갑니다. 포인터 연산을 사용하여 많은 C- 문자열 조작 알고리즘을 간단히 작성할 수 있습니다. 다음 코드를 고려하십시오.
char string1[4] = "abc";
char string2[4];
char* src = string1;
char* dest = string2;
while ((*dest++ = *src++));
이 코드는 포인터 산술을 사용하여 널 종료 C- 문자열을 복사합니다. 루프는 null이 발생하면 자동으로 종료됩니다.
C ++에서는 포인터 시맨틱이 반복자 개념으로 일반화됩니다 . 대부분의 표준 C ++ 컨테이너는 반복자를 제공하며 이는 begin
and end
함수 를 통해 액세스 할 수 있습니다 . 반복자는 포인터처럼 작동하며, 증분, 역 참조, 때로는 감소 또는 진행될 수 있습니다.
를 반복하기 위해 다음 std::string
과 같이 말합니다.
std::string s = "abcdef";
std::string::iterator it = s.begin();
for (; it != s.end(); ++it) std::cout << *it;
평범한 C- 문자열에 대한 포인터를 증가시키는 것처럼 반복자를 증가시킵니다. 이 개념이 강력한 이유는 템플릿을 사용 하여 필요한 개념 요구 사항을 충족하는 모든 유형의 반복자에 대해 작동하는 함수를 작성할 수 있기 때문 입니다. 그리고 이것이 STL의 힘입니다.
std::string s1 = "abcdef";
std::vector<char> buf;
std::copy(s1.begin(), s1.end(), std::back_inserter(buf));
이 코드는 문자열을 벡터에 복사합니다. 이 copy
함수는 증분 (일반 포인터 포함)을 지원 하는 모든 반복자 와 함께 작동하는 템플릿입니다 . copy
평범한 C- 문자열 에서 동일한 기능을 사용할 수 있습니다 .
const char* s1 = "abcdef";
std::vector<char> buf;
std::copy(s1, s1 + std::strlen(s1), std::back_inserter(buf));
우리 는 반복자를 지원 하는 하나 또는 모든 사용자 정의 컨테이너 copy
에서 사용할 수 있습니다 . std::map
std::set
포인터는 특정 유형의 반복자 인 random access iterator 라는 점에 유의하십시오. 즉 , +
and -
연산자로 증가, 감소 및 전진을 지원합니다 . 다른 반복자 유형은 포인터 의미론의 하위 집합 만 지원합니다. 양방향 반복기 는 적어도 증분 및 감소를 지원합니다. 앞으로 반복자 지원은 적어도 증가. (모든 반복자 유형은 역 참조를 지원합니다.)이 copy
함수에는 최소한 증분을 지원하는 반복자가 필요합니다.
여기에서 다양한 반복기 개념에 대해 읽을 수 있습니다 .
따라서 포인터 증가는 C- 어레이를 반복하거나 C- 어레이의 요소 / 오프셋에 액세스하는 관용적 인 C ++ 방식입니다.