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

Joh*_*ith 0 c++ templates iterator stl

我有这种情况:

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

我的问题是如何使其线程安全,特别是在递增/递减时?

以下是我所拥有的相关部分的草稿:

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];
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Mik*_*our 5

标准容器在迭代器对象中与容器分开维护它们的迭代状态,因此可以在容器上同时进行多次迭代.所以begin()end()返回迭代器,但不改变容器的状态; operator++作用于迭代器,而不是容器.对于像这样的简单数组,指针(对于a fruit*,而不是a fruit)可以很好地用作迭代器,因此您只需定义begin()end():

iterator begin() {return flist;}
iterator end() {return flist + count;}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

for (iterator i = my_fruit.begin(); i != my_fruit.end(); ++i)
    do_something_with(*i); // *i is a fruit*
Run Code Online (Sandbox Code Playgroud)

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

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