【问题标题】:Iterator Class Design in C++C++中的迭代器类设计
【发布时间】: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&lt; NameCollection::value_type &gt; 只是转换为NameIterator : public Iterator &lt; std::string &gt;,因为NameCollectionstd::vector&lt;std::string&gt;value_type 指的是传入的T 模板参数(@987654332 @) .. 我不清楚的是 NameManager 类试图通过教授通用迭代器来完成什么.. 它只是包装了 std::vector 所做的事情并以不同的方式呈现它.. ??跨度>
  • @n.m.我不明白 NameIterator: public Iterator 和 NameIterator: public Iterator 有什么区别
  • 没有全局value_typeIterator&lt; value_type&gt; 可能意味着什么?
  • @n.m. NameCollection::value_type 语句是否隐含意味着 Iterator 是 std::string 因为我们有一个 vector<:string>?

标签: c++ templates vector iterator


【解决方案1】:

想象一下,您正在编写应该能够与任何(或至少是通用)迭代器一起工作的通用代码。想想来自&lt;algorithm&gt; 的东西。这样的代码可能对值的类型(表达式*it 的类型)感兴趣。所以value_type typedef 是传递这些信息的标准接口。


NameCollection::value_type 当然是 std::string。它可以达到相同的目的:假设你想改变你的低调容器以使用宽字符串或其他东西。现在,如果您明确使用 std::string,您将不得不在任何地方找到并替换它。如果您使用 NameCollection::value_type 只需更改一行。

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

【讨论】:

  • 我明白为什么会有 value_type。我的问题是 NameCollection::value_type 是什么意思?它用于迭代器表达式以及函数 addName 中。同样在接下来的功能中,为什么我们需要 NameIterator::value_type 值,我们可以在那里使用 NameCollection 吗?
猜你喜欢
  • 2014-04-24
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 2014-03-21
  • 2015-08-03
  • 1970-01-01
相关资源
最近更新 更多