我想在使用openMP的C++中迭代映射,但我得到了三條錯誤消息,說
我的循環的初始化,終止和增量具有不正確的形式,而我在使用openmp方面相當新,所以有什麼辦法解決這個問題,同時獲得與串口相同的結果?以下是我使用的代碼在迭代映射中使用openmp
map< int,string >::iterator datIt;
#pragma omp parallel for
for(datIt=dat.begin();datIt!=dat.end();datIt++) //construct the distance matrix
{
...............
}
gcc自4.4版開始支持OpenMP 3.0,並且將在4.7版本中支持3.1,所以它大部分是在C++中被卡住的石器時代。除了openmp 3.0之外,只允許'random_access_iterators'作爲循環變量,但'map'只支持'bidrectional_iterators',所以這沒有幫助。爲什麼'std :: begin','std :: end'優先於成員函數,我沒有看到任何好處,因爲它除了調用成員函數之外什麼都不做。 – Grizzly 2012-01-25 22:14:59
@Grizzly我不知道GCC OpenMP支持,謝謝你。而且您應該使用非成員begin(...)和end(...),因爲它們可以專門用於支持缺少開始和結束成員函數的容器。這就把重點放在泛型編程上,這正是C++所擅長的。如果你不願意接受我的話,可以參考[Herb Sutter's](http://herbsutter.com/elements-of-modern-c-style/)。 – 2012-01-25 22:34:09
考慮到代碼中明確提到了迭代器的類型,並沒有使其更通用。除了'std :: begin'通常不能專門用於缺少成員函數的容器,因爲你不能部分地專門化函數模板,並且不允許在'std'中添加重載。爲了使它更通用,你需要使用一個非限定版本('begin()','end()'),加上'using namespace std;'或'using std :: begin;使用std :: end;',因爲我會假設容器更有可能具有成員函數,那麼獨立的命名空間版本 – Grizzly 2012-01-25 22:41:46