2013-08-17 1 views
0

저는 C++ 프로그래밍 초보자이며 iterator를 만들 필요가 있지만 요소를 인식하지 못하기 때문에 루프에 문제가 있습니다 (C++ 11에서). , 내가 설명 :내 자신의 클래스에서 반복자 생성 C++ 11

class myclass{ 
    std::string str; 
    myclass(); 
    std::iterator<(what do i have to put here?), char, diffptr_t, char*, char&> begin(){ 
     return str.begin(); 
    } 
} 

이 클래스 읽는 방법

void func(myclass& m){ 
    for(char a: m){ //Here's the problem, i don't know why it doesn't work 
     //do function 
    } 

어떤 몸이 그렇게 할 최선의 방법입니다 말할 수를 ?? 그리고 여기에 무슨 문제가 있니?

+0

같은 수 :: 반복자는 실제로 반복자의 유형으로 사용하는하지 반복자를 구현하는 데 도움을위한 것입니다. – Jake

답변

1

내가 제대로 질문을 이해한다면 적어도, 당신이 원하는 뭔가 같은 : 당신은 그냥 std::string에서 반복자를 반환하는 경우, 다음과 같은 일을 할 수 있어야

class myclass { 
    std::string str; 
public: 
    std::string::iterator begin() { return str.begin(); } 
    std::string::iterator end() { return str.end(); } 
}; 

void func(myclass &m) { 
    for (auto a : m) 
     // ... 
} 
+0

예, 저는 그것에 대해 생각해 보았습니다. 그러나 배우기 위해서였습니다. 반복자는 어떻게 만들어 졌습니까? (질문이 유감입니다.) – DrkDeveloper

+0

@ user2688108 : iterator는 비교 연산자 'operator *', 'operator ++', 그리고 더 많은 것을 오버로드하는 클래스입니다 (예 : 쌍방향 이터레이터 인 경우 'operator -'). [예] (http://stackoverflow.com/a/3479326/179910) 한 가지 예입니다. –

+0

iterator는 또한'std :: iterator'에서 상속 받거나 중첩 된 typedefs 자체를 제공해야합니다. – TemplateRex

1

:

auto begin() -> decltype(str.begin()) 
{ 
    return str.begin(); 
} 

간단한 반복기는 실제로 매우 간단 할 수 있습니다. 그것은 자신의 타입의 또 다른 반복자와 비교 될 수 있어야하고, 접두어 - 증가 연산자 (범위 기반 for 루프가 작동하기 위해)와 물론 역 참조 연산을 필요로합니다. 그게 다야.

당신이 경우에 그냥 메모, 표준으로

class iterator 
{ 
    friend myclass; // So that only `myclass` can construct this 

public: 
    bool operator==(const iterator& other) const 
    { 
     // Implement comparison 
    } 

    iterator& operator++() 
    { 
     // Increment 
     return *this; 
    } 

    char& operator*() const 
    { 
     // Return a reference to the "current" character 
    } 

    friend bool operator!=(const iterator& i1, const iterator& i2) 
    { 
     return !(i1 == i2); 
    } 

private: 
    iterator(...) { ... } 

    // Put the actual iterator here (e.g. `std::string::iterator`) 
}; 
+0

나는이 메소드 (주석 1과 2)를 사용할 것이지만 iterator를 생성하려면 알아야합니다. 모두에게 감사합니다 – DrkDeveloper

+0

@ user2688108 내 업데이트 된 답변보기 –

+0

이 반복기를 표준 알고리즘과 함께 사용하려면 적절한 value_type을 사용하여'std :: iterator'에서 상속하거나 이러한 중첩 된 유형을 직접 제공해야합니다. – TemplateRex