繁体   English   中英

自定义迭代器:如何跟踪它?

[英]Custom iterator: how do I keep track of it?

我有这种情况:

我有一个跟踪指针数组的类。 我构建了一个遍历此数组的自定义迭代器。

我的问题是如何使其具有线程安全性,尤其是在递增/递减时?

这是我所拥有的相关部分的草案:

typedef fruit * iterator;

class fruits
{
  private:
    fruit ** flist;
    int n;     //keeps track of position in flist
    int count; //number of fruits

  public:
    iterator begin() {n=0; return fruit[n];}
    iterator end() {n=count; return fruit[n];}

    iterator operator++ ()
    {
      return fruit[++n];
    }
}

我看到的问题是,如果程序的两个部分创建一个迭代器,则将无法正常工作。 C ++ STL如何处理它?

更新:我发现我的方式的错误。 迭代器应自行跟踪其位置。 为此,我在主类中创建了一个迭代器类。 生活现在很好。

标准容器与容器分开在迭代器对象中维护其迭代状态,因此容器上可以同时存在多个迭代。 因此begin()end()返回迭代器,但不要更改容器的状态; operator++作用于迭代器,而不作用于容器。 对于像这样的简单数组,指针(指向fruit* ,而不是fruit )可以很好地用作迭代器,因此您可以定义begin()end()

iterator begin() {return flist;}
iterator end() {return flist + count;}

并像这样使用它:

for (iterator i = my_fruit.begin(); i != my_fruit.end(); ++i)
    do_something_with(*i); // *i is a fruit*

只要多个线程都没有尝试修改容器,多个线程同时执行此操作就没有问题。

另一方面,除非这是一次学习练习,以更好地了解容器和迭代器的工作方式,否则使用std::vector比实现自己的版本要好得多。

暂无
暂无

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

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