【发布时间】:2015-09-30 15:43:40
【问题描述】:
我正在尝试学习用 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;
}
【问题讨论】:
-
目前尚不清楚您遇到了什么样的问题。你希望用什么来代替
NameCollection::value_type? -
I don't understand the use of having NameCollection::value_type here...NameIterator: public Iterator< NameCollection::value_type >只是转换为NameIterator : public Iterator < std::string >,因为NameCollection是std::vector<std::string>和value_type指的是传入的T模板参数(@987654332 @) .. 我不清楚的是NameManager类试图通过教授通用迭代器来完成什么.. 它只是包装了std::vector所做的事情并以不同的方式呈现它.. ??跨度> -
@n.m.我不明白 NameIterator: public Iterator 和 NameIterator: public Iterator 有什么区别
-
没有全局
value_type。Iterator< value_type>可能意味着什么? -
@n.m. NameCollection::value_type 语句是否隐含意味着 Iterator 是 std::string 因为我们有一个 vector<:string>?
标签: c++ templates vector iterator