我遇到这种情况:
我有一个跟踪指针数组的类。我构建了一个循环遍历此数组的自定义迭代器。
我的问题是如何使其线程安全,特别是在递增/递减时?
以下是我所拥有的相关部分的草稿:
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如何处理它?</ p>
更新:我发现了我的方式错误。迭代器应该跟踪它自己的位置。为此,我创建了一个嵌入在我的主类中的迭代器类。生活现在很好。
答案 0 :(得分:5)
标准容器在迭代器对象中与容器分开维护它们的迭代状态,因此可以在容器上同时进行多次迭代。所以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
比使用自己的版本更好。