使用concurrent_vector迭代器的算术:假设从迭代器中减去'begin ()'会给出索引是否安全?
Arithmetic with concurrent_vector iterators: is it safe to assume that subtracting 'begin ()' from an iterator will give the index?
由于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
呢?
- 如果你改变容器,它将工作。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 我的代码在作为参数传入 .begin() 时不起作用,但在我将 .begin() 转换为迭代器后工作
- 迭代器返回 vector::begin()
- C++ unordered_set的迭代器 begin() 是否总是指向相同的元素
- 如果对于某些有序的容器s,例如迭代器s.begin(),例如x,例如S是一组
- 由set2.begin()返回的迭代器类型
- 插入后使用 set::begin() 迭代器
- 减少 begin() 迭代器,然后再次增加它
- std::map::begin() 之前的 STL 迭代器
- map的begin迭代器无法使用c++
- 迭代器begin()应该包含3,输出为2
- 带有std::begin()、std::end()问题的C++11自动迭代器类型
- 为什么迭代器在与map.begin()一起使用时预先增加了
- 为我的向量包装器和迭代器返回'begin'和'end'函数返回什么?
- 使用concurrent_vector迭代器的算术:假设从迭代器中减去'begin ()'会给出索引是否安全?
- 为什么stl_tree.h中的end()返回对迭代器对象的引用,而begin()返回object ?
- 自减迭代器,直到vector的.begin()
- get begin(VEC) / end(VEC)由它们之间的迭代器实现
- 减去X.begin()如何返回迭代器的索引?
- 通过在getter方法上应用begin()获得的迭代器不允许访问指向列表的第一个元素