2013-05-01 28 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