Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 自定义迭代器:如何跟踪它?_C++_Templates_Stl_Iterator - Fatal编程技术网

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

C++ 自定义迭代器:如何跟踪它?,c++,templates,stl,iterator,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 pu

我有这样的情况:

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

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

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

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()
返回迭代器,但不更改容器的状态<代码>运算符+++作用于迭代器,而不是容器。对于这样的简单数组,指针(指向
结果*
,而不是
结果
)作为迭代器非常有效,因此您可以定义
开始()
结束()

然后像这样使用它:

for (iterator i = my_fruit.begin(); i != my_fruit.end(); ++i)
    do_something_with(*i); // *i is a fruit*
多个线程同时执行此操作没有问题,只要它们都不尝试修改容器


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

标准容器在迭代器对象中与容器分开维护其迭代状态,因此,可以在容器上同时进行多次迭代。因此
begin()
end()
返回迭代器,但不更改容器的状态<代码>运算符+++作用于迭代器,而不是容器。对于这样的简单数组,指针(指向
结果*
,而不是
结果
)作为迭代器非常有效,因此您可以定义
开始()
结束()

然后像这样使用它:

for (iterator i = my_fruit.begin(); i != my_fruit.end(); ++i)
    do_something_with(*i); // *i is a fruit*
多个线程同时执行此操作没有问题,只要它们都不尝试修改容器


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

感谢在迭代器本身中保存state else的想法。感谢在迭代器本身中保存state else的想法。