C ++基础迭代器存储在std :: map中

时间:2013-04-11 20:02:58

标签: c++ c++11 iterator

我想对一个简单的代码示例提出一些想法:

class Base{

public:
  void doSomeNastyThings(int param)
  {
    IteratorInterface *iter_face = iterators[param];
    for(auto it = iter_face->begin(); it != iter_face->end(); it++)
    {
      //do another nasty things
    }
  }

protected:
  std::map<int, IteratorInterface*> iterators;
};

我希望从派生类中填充迭代器映射....但是如何在STL样式中创建这样的IteratorInterface?所有迭代器都会为我提供相同类型的访问权限(让我称之为'T'),但它们可以有不同的类型:

std::map<T>::iterator, std::vector<T>::iterator, foo<T>::iterator.

2 个答案:

答案 0 :(得分:1)

一种方法是创建从IteratorInterface派生的模板类,它将使用迭代器执行令人讨厌的事情,实现IteratorInterface并为您可能希望它使用的每个迭代器提供实现。但首先你应该阅读this帖子,并可能重新思考整个想法。

答案 1 :(得分:1)

有可能,但不推荐。

您必须创建一个抽象基类模板,比如说BaseIteratorImpl<T>,并且对于每个不同的迭代器类型,创建一个具体的派生类,比如说VectorIteratorImpl<T> : public BaseIteratorImpl<T>。您还需要创建保存并封装指向IteratorInterface<T>的{​​{1}},以便为迭代器提供熟悉的值语义。

更一般地说,而不是BaseIteratorImpl<T>VectorIteratorImpl<T>和......可以创建

ListIteratorImpl<T>

并使用例如class IteratorImpl<ContainerType> : public BaseIteratorImpl<typename ContainerType::value_type>

IteratorImpl<vector<double> >会将所有常用的迭代器操作转发给其IteratorInterface<T>成员。 BaseIteratorImpl<T>将为每个操作提供纯虚函数。 BaseIteratorImpl<T>将实施这些操作。

不建议这样做,因为您必须编写大量代码,结果只会导致巨大的性能损失。

而不是迭代器,您应该使用算法IteratorImpl<C>内发生的事情)执行此操作(模板化+虚拟化)。