2016-07-07 5 views
0

は、私は1つによって長256std::vector<size_t>内の各要素を増やしたいが、同じ位置に応じstd::bitset<256>1等しい場合)。増加要素::ベクトル<T> STDに応じ::ビットセット<N>

下記のコードは編集/編集することができますhere

私の質問は、forループから離れ、いくつかの高速論理演算子を得ることができますか?我々は単にstd::transformを使用することはできませんので、bitset

#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'が気に入らなければ' if(a)b + = 1'を 'b + = a'(' a'は0または1)なので置き換えることができます。 –

+0

私はそうではありません、任意のベクトル長を処理している場合、上記のコンパイラは、複数のデータの1つの演算レジスタで動作するループアンローリングを行います。 – user1447257

+0

ループが厄介な場合は、いつも 'std :: transform(v.begin()、v.end()、b.rbegin()、v.begin()、std :: plus ())' – user1447257

答えて

1

はイテレータを持っていません。しかし、イテレータのようなラッパーをの周りに作成し、インデックスのように使用することができます。

#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'クラスは便利な汎用ツールです。 '演算子'を追加すると、 'std :: make_reverse_iterator(IntegralIterator(size))'を実行できるようになり、単に 'b [index]'を実行することができます。 – SirGuy

+0

とにかく、私はこれが彼のコードよりも速くないことを指摘しなければならないと思います。文法を変えるだけです。 – SirGuy

+0

@GuyGreerより速いかもしれないし、そうでないかもしれない - opの変種はループ内で 'if'を使い、コンパイラはそれを実装するために条件付きジャンプやフラグ操作を使うことができます。一般的にはそうですが、それは高速ではありませんが、 'for'ループを取り除き、論理演算子を使用しようとしていました。私の答えはループと 'if'を使わないという近似です。 – user2807083

関連する問題