2011-09-18 33 views
3

我有一個稀疏壓縮列格式的數據結構。在std中傳遞向量位置:: for_each

對於我的給定算法,我需要遍歷數據「列」中的所有值並做一堆事情。目前,它正在使用常規for循環很好地工作。老闆想讓我把它重新編碼爲for_each循環,以便將來進行並行化。

對於那些不熟悉稀疏壓縮列的人來說,它使用2(或3)個向量來表示數據。一個向量只是一長串值。第二個向量是每列開始位置的索引。

當前版本 //用於處理第5列中的數據 矢量值; vector colIndex; vector rowIndex;

int column = 5; 
for(int i = conIndex[5]; i != colIndex[6]; i++){ 
    value = values[i]; 
    row = rowIndex[i]; 
    // do stuff 
} 

的關鍵是,我需要知道我的值列位置(作爲一個整數)爲了查找行位置(和其他的東西一大堆我沒有打擾到這裏列出)

如果我使用std :: for_each()函數,我得到的是該位置的值,而不是位置。我需要自己的位置。

一個想法,顯然效率不高,會創建一個與我的數據長度相同的整數向量。這樣,我可以將迭代器通過該虛擬向量傳遞給for_each中的函數,傳遞給我的函數的值將成爲該位置。但是,這似乎是效率最低的方式。

有什麼想法?

我的挑戰是我需要知道向量中的位置。 for_each需要一個迭代器並將該迭代器的值發送給該函數。

回答

4

使用boost::counting_iterator<int>,或實現自己的。

1

@納米的回答可能是最好的,但有可能只用什麼標準庫提供,雖然極其緩慢我認爲:

void your_loop_func(const T& val){ 
    iterator it = values.find(val); 
    std::ptrdiff_t index = it - values.begin(); 
    value = val; 
    row = rowIndices[index]; 
} 

和寫作這之後,我真的只能推薦升級counting_iterator版本。 ;)