c++中的迭代器类设计

Iterator Class Design in C++

本文关键字:迭代器 c++      更新时间:2023-10-16

我正在学习用c++编写泛型迭代器的概念。我遇到了下面这个例子。我不明白这里有NameCollection::value_type的用途。为什么我们不能Iterator<value_type>,因为它是一个模板化类。

#include<iostream>
#include<vector>
using namespace std;
template<typename T>
class Iterator {
 public:
 typedef T value_type;
 virtual bool hasNext() = 0;
 virtual T next() = 0;
};
class NameManager {
 typedef vector<string> NameCollection;
 NameCollection m_names;
 public:
 class NameIterator: public Iterator< NameCollection::value_type > {
        friend class NameManager;
 private:
        NameManager::NameCollection & m_names;
        NameManager::NameCollection::iterator m_itr;
        NameIterator(NameManager::NameCollection & names) : m_names(names), m_itr(m_names.begin()) {}
 public:
        virtual bool hasNext() {
                return m_itr!=m_names.end();
        }
        virtual NameIterator::value_type next(void) {
                NameIterator::value_type value = (*m_itr);
                ++m_itr;
                return value;
        }
 };
 void addName(NameCollection::value_type name){
        m_names.push_back(name);
 }
 NameIterator getNameIterator(void) {
        return NameIterator(m_names);
        }
 };
int main(void) {
        NameManager nameMgr;
        nameMgr.addName("Jobs");
        nameMgr.addName("Bill");
        nameMgr.addName("Larry");
        NameManager::NameIterator nameItr = nameMgr.getNameIterator();
        while(nameItr.hasNext()) {
                cout<<nameItr.next() << endl;
        }
        return 0;
}

假设您正在编写能够与任何(或至少是泛型)迭代器一起工作的泛型代码。想想<algorithm>里的东西。这样的代码可能对值的类型(表达式*it的类型)感兴趣。因此,value_type typepedef是传递此信息的标准接口。


NameCollection::value_type当然是std::string。它可以用于相同的目的:假设您想要更改underplay容器以使用宽字符串或其他东西。现在,如果您显式地使用std::string,您将不得不到处查找并替换它。如果使用NameCollection::value_type,只需要修改一行。

你也可以在函数'next'中使用它(它会工作),但从语义上讲,在那里使用迭代器更有意义,因为这个函数都是关于迭代器的。