2016-07-07 86 views
0

我想通過一個以增加其在std::vector<size_t>與長度256每個元件,但根據的相同位置的std::bitset<256>(如果等於1)。增加元素::矢量<T>根據標準::位集<N>

下面的代碼可以編輯/編譯here

我的問題是,我可以擺脫for循環,並得到一些快速的邏輯運算符?

#include <iostream> 
#include <bitset> 
#include <vector> 
#include <iterator> 
#include <algorithm> 

#define SIZE 3 

int main() { 

    size_t size=SIZE; 
    std::vector<size_t> v(SIZE); v={3,0,7}; 
    std::bitset<SIZE> b("110"); 

    for (size_t i=0; i<size; ++i) 
    { 
     if (b[size-1-i]) // reverse 
     { 
      ++v[i]; 
     } 
    } 

    std::copy (v.begin() 
       , v.end() 
       , std::ostream_iterator<size_t>(std::cout, ",")); 

    // 3+1,0+1,7+0 
    // => 4,1,7 

    return 0; 
} 
+0

您可以嘗試「矢量化」。每次讀取2位,根據值生成一個0或1的SSE向量(使用表格),然後直接通過訪問向量緩衝區來添加它。如果你不喜歡'if',你可以用'b + = a'替換'(a)b + = 1'(因爲'a'爲0或1)。 –

+0

我不這麼認爲,如果你正在處理任意向量長度,在上面編譯器會做一個循環展開操作多個數據一個操作寄存器。 – user1447257

+0

如果循環令人討厭,你總是可以嘗試'std :: transform(v.begin(),v.end(),b.rbegin(),v.begin(),std :: plus ())' – user1447257

回答

1

由於bitset沒有迭代器,我們不能簡單地用std::transform。但我們可以在size_t周圍創建類似迭代器的包裝並像索引一樣使用它:

#include <iostream> 
#include <bitset> 
#include <vector> 
#include <iterator> 
#include <algorithm> 

#define SIZE 3 

class IntegralIterator 
{ 
public: 
    IntegralIterator(size_t v = 0) : value(v) {} 

    size_t operator*() 
    { 
     return value; 
    } 

    IntegralIterator& operator++() 
    { 
     ++value; 
     return *this; 
    } 

private: 
    size_t value; 
}; 

int main() { 

    size_t size=SIZE; 
    std::vector<size_t> v(SIZE); v={3,0,7}; 
    std::bitset<SIZE> b("110"); 

    std::transform(v.begin(), v.end(), IntegralIterator(), v.begin(), 
     [&](size_t s, size_t index) 
     { 
      return s + b[size-1-index]; 
     }); 

    std::copy(v.begin(), v.end(), 
       std::ostream_iterator<size_t>(std::cout, ",")); 
    return 0; 
} 
+0

你的'IntegralInterator'類可能是一個方便的通用工具。添加一個'operator - '可以讓你執行'std :: make_reverse_iterator(IntegralIterator(size))',然後你可以簡單地執行'b [index]'。 – SirGuy

+0

無論如何,我想我應該指出,這不會比他的代碼更快,它只是改變了語法。 – SirGuy

+0

@GuyGreer,它可能會也可能不會更快 - op的變體在循環內使用if,並且編譯器可以使用條件跳轉或標誌操作來實現它。在一般情況下,是的,這不是更快,但問題是要擺脫'for'循環並使用邏輯運算符。我的回答是近似不使用循環和'if'。 – user2807083