C++ 使用并发向量迭代器的算术:假设减法';开始()';从迭代器将给出索引?

C++ 使用并发向量迭代器的算术:假设减法';开始()';从迭代器将给出索引?,c++,multithreading,visual-c++,concurrency,iterator,C++,Multithreading,Visual C++,Concurrency,Iterator,由于并发_向量不使用连续内存块,我只想确定这是否正常: 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

由于并发_向量不使用连续内存块,我只想确定这是否正常:

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 ();
concurrency::concurrent\u vector my\u array;
//以某种方式填充“m_数组”,可能涉及多个线程
const auto iter=std::find_if(my_array.begin()、m_array.end()、SomeLambda);
const int index=iter-my_array.begin();
我的问题:是否有任何情况下“index”不会索引我刚刚找到的元素(通过concurrect_vector::operator[]方法)?我意识到另一个线程理论上可以修改元素-这不是我的问题


我想这应该行得通,但因为我习惯于使用原始指针,所以我只想问一下(这样我就不会无意中添加一些微妙的bug)。

并发向量::迭代器是一个随机访问迭代器,所以取差是受支持的,也是有效的(尽管您不应该使用
int
来存储结果)


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

它是安全的,但是为什么不使用呢

  • 它更地道
  • 如果您更换容器,它将起作用
  • 它同样有效

什么是
concurrent\u vector
?它有一个
差异类型
,文档上说它是一个随机访问迭代器,所以假设MS是正常的并且遵循,这是安全的。谢谢@BoBTFish。这是一个有用的参考。微软的
concurrent\u vector
是从tbb的
concurrent\u vector
派生出来的。如果是的话你需要将你的代码移植到一些不是windows的东西上,你几乎可以在不做任何更改的情况下删除tbb实现:谢谢@Joe。我将继续根据这个答案编写我的代码。谢谢你也修改了这个问题-我没有意识到并发向量是特定于Microsoft的,但这仍然很好,因为我只在V中编写代码iVisual Studio。@Coder\u Dan它似乎并没有给STL::vector添加太多内容。如果您想要可移植的代码,您可以很容易地编写此功能。话虽如此,其他人可能已经完成了。谢谢@Alex。我是STL的新手,以前从未遇到过std::distance。