繁体   English   中英

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

[英]C++ base iterator stored within std::map

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

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派生的模板类,该模板类将使用Iterator做讨厌的事情,实现IteratorInterface并为您可能希望与之一起使用的每个迭代器提供实现。 但是首先,您应该阅读这篇文章,并可能重新考虑整个想法。

有可能,但不建议这样做。

您将必须创建一个抽象的基类模板,例如BaseIteratorImpl<T> ,并为每种不同的迭代器类型创建一个具体的派生类,例如VectorIteratorImpl<T> : public BaseIteratorImpl<T> 您还需要创建IteratorInterface<T> ,该IteratorInterface<T>保留并封装指向BaseIteratorImpl<T>的指针, BaseIteratorImpl<T>迭代器提供熟悉的值语义。

更笼统地说,代替VectorIteratorImpl<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内部发生的事情)执行此操作(模板化+虚拟化)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM