使用concurrent_vector迭代器的算术:假设从迭代器中减去'begin ()'会给出索引是否安全?

Arithmetic with concurrent_vector iterators: is it safe to assume that subtracting 'begin ()' from an iterator will give the index?

本文关键字:迭代器 begin 安全 是否 索引 vector concurrent 假设 使用      更新时间:2023-10-16

由于concurrent_vector不使用连续内存块,我只是想确定这是否可以:

concurrency::concurrent_vector<Something> my_array;
//Populate 'm_array' somehow perhaps involving multiple threads
const auto iter  = std::find_if (my_array.begin (), m_array.end (), SomeLambda);
const int  index = iter - my_array.begin ();

我的问题:是否有任何情况下'索引'不会索引我刚刚发现的元素(通过concurrect_vector::operator[]方法)?我意识到另一个线程理论上可以修改元素——这不是我的问题。

我想这应该可以工作,但是因为我习惯使用原始指针,所以我只是想问一下(这样我就不会无意中添加一个微妙的bug源)。

concurrent_vector::iterator是一个随机访问迭代器,所以取差值是支持的并且是有效的(尽管你不应该使用int来存储结果)。

当然,正如你注意到的,这不是线程安全的。

这是安全的,但为什么不使用std::distance呢?

  • 如果你改变容器,它将工作。