2017-01-25 1 views
6

Angew made a comment 원시 포인터를 반복자 형식으로 사용하는 vector이 괜찮 았다고합니다. 그 정도는 나를 위해 루프를 던졌다.포인터를 컨테이너 반복자로 사용합니까?

나는 그것을 연구 시작 vector 반복자에 대한 요구 사항이 포인터 자격이 있음을 그들은 그것을 명시 적으로 언급되는 "Random Access Iterators" 만 있다는 것을 발견했다 :

포인터를 배열을 만족하는 모든 요구 사항

의 요소에

컴파일러가 디버거 용으로 vector에 반복기를 제공하는 유일한 이유는 아니면 실제로 내가 놓친 요구 사항입니까? vector?

+0

표준 라이브러리의 나머지 부분과 일관성이 더 높습니다. ({}}} {{{}} {template} {template} {template} {template} {template} {template} 이런 식으로'iterator','begin','end'를 제공하는 한 당신이 사용하는 컨테이너의 타입을 신경 쓰지 않습니다. – 0x5453

+0

@ 0x5453 당신이하는 말을 이해할 수 없습니까? 분명히 컨테이너는 반복자를 반환해야합니다. 난 그냥 원시 포인터를 반환 합리적이라고 생각하지 않았다. 당신은 그 진술이나 다른 것을 언급하고 있습니까? –

+0

까다로운 부분은'std :: vector :: iterator'의 ADL 관련 네임 스페이스입니다. 포인터는'std'를 관련 네임 스페이스로 가지고 있지 않습니다. 표준에서는 iterator가 관련 네임 스페이스로'std'를 가질 것을 요구하지 않는다. – MSalters

답변

3

§ 24.2.1

그들의 의미는 C++에서 포인터의 의미 대부분의 일반화이다. 이렇게하면 이터레이터를 사용하는 모든 함수 템플릿이 일반 포인터와 함께 작동합니다.

그래, 포인터를 사용하면 Random Access Iterator에 대한 모든 요구 사항을 충족합니다.

std::vector 가능성이 표준이 정상적으로라는 몇 가지 이유

  1. 에 대한 반복자를 제공합니다. std::vector 동안 용기 등 std::map 또는 std::set 제공 반복자 만 value_type* 포인터를 한 경우

  2. 이 홀수 일 것이다. 반복자는 컨테이너 라이브러리 전체에 일관성을 제공합니다.

  3. 예를 들어 std::vector<bool>과 같은 벡터 유형을 특수화 할 수 있습니다. 여기에서 value_type* 포인터는 유효한 반복자가 아닙니다.

+0

"반복기는 포인터의 추상화"라는 문장에서 "표준에서 말하는 것"이라고 생각하면 되겠습니까? –

+0

"표준은 벡터에 반복자가있는 이유를 설명합니다." 숫자 2와 3은 단지 두 가지 가능한 이유 일뿐입니다. 왜 표준이 그렇게해야하는지 말입니다. – lcs

2

내 50 센트 :

반복자는 어떤 STL 컨테이너에 액세스하는 일반적인 방법입니다. 당신이 말하는 것은 : 포인터가 벡터의 반복자를 대체하는 것으로서 OK이므로, 왜 벡터의 반복자가 있습니까?

글쎄, 누가 C++에서 중복을 가질 수 없다고 했습니까? 실제로 동일한 기능에 대해 서로 다른 인터페이스를 갖는 것이 좋습니다. 그건 문제가 아니야.

한편, 반복기를 사용하는 알고리즘이있는 라이브러리에 대해 생각해보십시오. 벡터가 반복자를 가지지 않는다면 그것은 예외에 대한 초대입니다 (프로그래밍 감각이 아니라 언어적인 예외는 아닙니다). 알고리즘을 작성해야 할 때마다 포인터가있는 벡터에 대해 다른 작업을 수행해야합니다. 하지만 왜? 이 번거 로움에 대한 이유가 없습니다. 모든 것을 동일한 방식으로 인터페이스하십시오. 반복자 포인터의 추상화이므로

+0

iterator와 포인터간에 다른 작업을 수행해야하는 작업은 무엇입니까? 나는 실제로 어떤 것도 생각할 수 없다. –

+0

@JonathanMee 자신의 요점은 반복자가 다른 클래스와 마찬가지로 벡터 클래스를 사용할 수 있도록 동일한 인터페이스를 사용할 수 있도록한다는 것입니다. 벡터 클래스의 특수 처리를 방지하고 반복자를 사용하여 다른 모든 작업을 수행하는 것을 선호하는 사람은 예. – Carmageddon

+0

@Carmageddon 포인터를 사용하는 것보다 반복기에서 어떻게 다르게 작동하는지 예를 들어 주시겠습니까? 포인터가 다르게 처리되거나 반복기와 다르게 작동해야하는 경우 이는 매우 유용한 대답입니다. 그러나 그들이 동일한 사업자를 제공하고 동일한 행동을 취한다면 이것은 큰 대답이 아닙니다. (필자는 수년간 반복자를 사용하여 포인터를 상호 교환 가능하게 사용 해왔다.) –

2

은 무엇 그 의견을 말하는 것은

template <typename T, ...> 
class vector 
{ 
public: 
    typedef T* iterator; 
    typedef const T* const_iterator; 
    ... 
private: 
    T* elems; // pointer to dynamic array 
    size_t count; 
    ... 
} 

이 유효한 것입니다. 마찬가지로 std:: 알고리즘과 함께 사용하기위한 사용자 정의 컨테이너도이를 수행 할 수 있습니다. 그런 다음 템플릿에서 Container::iterator을 입력하면이 인스턴스에서 이 다시 입력되고T*이고 제대로 작동합니다.

따라서 표준에서는 vectorvector::iterator에 대한 정의가 필요하며이를 코드에 사용해야합니다. 한 플랫폼에서 배열로의 포인터로 구현되지만 다른 플랫폼에서는 다른 것입니다. 중요하게도 이러한 것들은 표준이 규정 한 모든 측면에서 동일한 방식으로 행동합니다.

+0

나는 이것이 OP의 진정한 근저에 관한 질문을 다루는 유일한 대답이라고 생각한다. – Angew

관련 문제