c++ - 自定义迭代器 : how do I keep track of it?

标签 c++ templates stl iterator

我有这种情况:

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

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

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

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 比实现您自己的版本要好得多。

关于c++ - 自定义迭代器 : how do I keep track of it?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3081108/

相关文章:

python.clang AST解析: getting c++ template argument of field declaration

c++ - unique_ptr 列表,用于派生模板类

c++ - CUDA:堆栈和堆

c++ - 检查类是否具有给定签名的成员函数

c# - 需要从非托管 C++ 代码调用托管代码

templates - 使用 Ember.js 文本字段 id 作为 <label> 标签

c++ - std::vector 在返回之前被自动清除

c++ - Boost 或 STL 是否提供类似于 QString 的功能?

c++ - 当指定派生类的析构函数时,std::move 不起作用

c++ - 将 uint64 转换为 uint32