2013-03-10 79 views
0

我希望通過向量定義一個迭代器類,並且它的私有成員p如何匹配std :: vector :: begin()的返回類型?如何定義迭代器類的成員的類型以使用STL容器方法?

class A{ 

struct element{ 
     ... 
} 

    class e_iterator { 

    e_iterator() : p() 

    ... 

    private: 
     element* p; 
    }; 

    e_iterator e_begin() const{ 
    e_iterator Iter; 
    Iter.p = e_.begin(); // error 
    return Iter; 
    } 

std::vector<element> e_; 

} 我收到一個錯誤與element* p

error: cannot convert 'std::vector<element, std::allocator<element>>::const_iterator' to 'element*' in assignment 
+0

你究竟想要做什麼和實現什麼? – Nawaz 2013-03-10 19:25:28

+0

什麼是'e_'?.. – 2013-03-10 19:25:32

+1

@AndyProwl:'e_'顯然是'std :: vector const&'。 – Nawaz 2013-03-10 19:26:01

回答

1

隨着你給予什麼,我可以建議最多的就是改變p到:

std::vector<element>::const_iterator p; 

一個簡單的事實一個std::vector迭代器不是一個指針(可能)。它是一種未指定的類型,其行爲類似於指針 - 它滿足隨機訪問迭代器的要求。

當您在非const容器上致電begin()時,將獲得iterator類型。當您在const迭代器上調用它時,會得到一個const_iterator類型。由於您的a_begin成員函數被標記conste_似乎是你的類的std::vector<element>成員,e_是及物動詞const,因此調用begin()上它也將讓你const_iterator

但是很難確切地告訴你在這裏做什麼,以及這是否是正確的方法。

+0

「當你在非const迭代器上調用begin()時,」你的意思是容器? – cgmb 2013-03-10 20:18:03

+0

@ Slavik81是的!謝謝。 – 2013-03-10 20:28:45

1

在您的迭代器類中更改element* pconst element* p或從e_begin()方法中刪除const限定符。 或者提供const/non-const迭代器。我也建議初始化指針在迭代器的構造函數:

template <bool isconst> 
class e_iterator_ { 

    public: 
    typedef std::conditional<isconst, const element*, element*>::type elementptr; 

    e_iterator_(elementptr e) : p(e) 

    ... 

    private: 
    elementptr p; 
}; 

typedef e_iterator_<true> const_e_iterator; 
typedef e_iterator_<false> e_iterator; 

然後,你可以使用std ::向量的data()成員方法直接訪問向量的基本陣列。

e_iterator e_begin() const{ 
    const_e_iterator Iter(e_.data()); 
    return Iter; 
    } 

希望這會有所幫助。

相關問題