存储在std::map中的c++基迭代器

C++ base iterator stored within std::map

本文关键字:c++ 迭代器 中的 map std 存储      更新时间:2023-10-16

我想在一个简单的代码示例中展示一些想法:

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.

一种方法是创建从IteratorInterface派生的模板类,它将对迭代器做一些讨厌的事情,实现IteratorInterface并为您可能希望使用它的每个迭代器提供实现。但首先你应该阅读这篇文章,并重新考虑整个想法。

这是可能的,但不推荐。

您必须创建一个抽象基类模板,例如BaseIteratorImpl<T>,并为每个不同的迭代器类型创建一个具体的派生类,例如VectorIteratorImpl<T> : public BaseIteratorImpl<T>。您还需要创建IteratorInterface<T>来保存和封装指向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>将实现这些操作。

不建议这样做,因为您将不得不编写大量的代码,并且只会导致巨大的性能损失。

比起迭代器,您应该使用算法来执行此操作(模板化+虚拟化)(在doSomeNastyThings中发生的事情)