2013-08-17 40 views
0

我是C++编程的新手,我需要创建迭代器,但我遇到了循环问题(在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

就像一个音符,的std :: iterator是帮助不实现迭代器实际使用的迭代器的类型。 – Jake

回答

1

至少如果我正确地理解你的问题,你想要的东西,如:

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:迭代器是一个重载比较,'operator *','operator ++'和可能更多的类(例如,如果它是一个双向迭代器,则为'operator - ')。 [Here's](http://stackoverflow.com/a/3479326/179910)一个例子。 –

+0

迭代器也应该从'std :: iterator'继承,或者提供一堆嵌套的typedefs本身 – TemplateRex

1

如果你只是从返回的std::string迭代器,那么你应该能够做这样的事情:

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),但我需要知道创建迭代器。感谢所有 – DrkDeveloper

+0

@ user2688108查看我的更新回答 –

+0

您应该从'std :: iterator'继承相应的value_type,或自己提供这些嵌套类型,以便将此迭代器与标准算法一起使用。 – TemplateRex