2013-05-01 68 views
2

由于concurrent_vector不使用连续的内存块,我只是想确信这是否是好的:使用concurrent_vector迭代器的算法:假设从迭代器中减去'begin()'会给出索引是否安全?

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 []方法)?我意识到另一个线程理论上可以修改元素 - 这不是我的问题。我想这应该工作,但因为我习惯于使用原始指针,我只想问(这样我就不会无意中添加一个微妙的错误来源)。

+3

什么是'concurent_vector'? – 2013-05-01 11:15:35

+1

http://msdn.microsoft.com/en-us/library/ee355343.aspx? – BoBTFish 2013-05-01 11:16:02

+1

它有一个'difference_type',文档说它是一个随机访问迭代器,所以假设MS是理智的并遵循[该短语的标准含义](http://en.cppreference.com/w/cpp/concept/RandomAccessIterator),这是安全的。 – BoBTFish 2013-05-01 11:21:09

回答

3

concurrent_vector::iterator是一个随机访问迭代器,因此支持和有效(尽管您不应该使用int来存储结果)。

当然,如您所知,这不是线程安全的。

+0

谢谢@Joe。我会继续在这个答案的基础上写我的代码。感谢您也修改了这个问题 - 我没有意识到concurrent_vector是特定于Microsoft的,但这仍然很好,因为我只在Visual Studio中编写代码。 – 2013-05-01 11:21:53

+0

@Coder_Dan它似乎没有增加很多'std :: vector'。如果你想要可移植的代码,你可以很容易地编写这个功能。话虽如此,其他人可能已经做到了。 – 2013-05-01 11:32:15

3

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

  • 它更习惯。
  • 它会工作,如果你改变容器。
  • 它一样高效。
+0

谢谢@Alex。我是STL的新手,并且之前没有遇到std :: distance。 – 2013-05-01 11:27:56