2012-02-22 16 views

答えて

7

このようstd::generate_nを使用し、@のzmbqの答えに拡大することです:あなたが使用することになり

std::vector<bool> v; 
v.reserve(desired_size); 

bool b = true; 
std::generate_n(std::back_inserter(v), desired_size, [&b]() { return (b = !b); }); 

std::generateの場合vectorすでにサイズでした。

あなたがC++ 11コンパイラを持っていない場合は

...

std::vector<bool> v; 
v.reserve(desired_size); 

struct GenFn 
{ 
    GenFn(bool b = true) 
     : b(b) 
    { 
    } 

    bool operator()() const 
    { 
     return (b = !b); 
    } 

private: 
    bool b; 
}; 

std::generate_n(std::back_inserter(v), desired_size, GenFn()); 
+0

"ベクトルがすでにサイズを持っていればstd :: generateを使用しますが、そうでなくても0サイズのベクトルでも最初に' reserve'したいと思うかもしれません。 –

+0

非C++ 11のサンプルがどこかにコピーペーストされる可能性があるので、ジェネレータファンクタを匿名型のインスタンスではなく名前付きの型にするとよいでしょう。それが最後に使用された状態を '覚えていない')、ユーザ定義のコンストラクタを少なくとも1つ持つ必要があります。したがって、bは必ず初期化されます。 –

+0

十分に公正です。私は眠くて怠け者になったので、初期化のステップは間違いなく必要なものでした。 :) – moswald

0

あなたはこの

#include<vector> 
#include<iostream> 
using namespace std; 

int main() 
{ 
    bool bool_array[] = {true,false,true,false,true,false,true,false}; 
    vector<bool> bVec; 
    bVec.insert(bVec.begin(),bool_array,&bool_array[sizeof(bool_array)/ sizeof(*bool_array)]); 
    for(int i=0;i<bVec.size();++i){ 
     cout<<"At pos :"<<i<<" Val is:"<<bVec[i]<<endl; 
    } 
    return 0; 
} 

ような何かを試すことができ、出力は

At pos :0 Val is:1 
At pos :1 Val is:0 
At pos :2 Val is:1 
At pos :3 Val is:0 
At pos :4 Val is:1 
At pos :5 Val is:0 
At pos :6 Val is:1 
At pos :7 Val is:0 
+0

挿入を使用する代わりにその処理を行うコンストラクタを使用する方が高速でしょうか?それは大きなベクトルです。 – Marty

3

zmbqに触発され、私はこれを書いて、それが動作します:

#include <algorithm> 
#include <vector> 

bool fill01() 
{ 
    static int val=1; 
    val=++val%2; 
    return val==0?false:true; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::vector<bool> ve(100); 
    std::generate(ve.begin(), ve.end(), fill01); 
    return 0; 
} 
1

別の可能性(コードがテストされていません、バグかもしれない)。基本的には、mosのgenerate_nと同じですが、別のルートです。

struct flipflop_iterator : public std::iterator<std::forward_iterator_tag, bool> { 
    bool offset; // make sure the first value is false 
    size_t remaining; 
    flipflop_iterator(size_t length) : offset(length % 2), remaining(length) {} 
    flipflop_iterator &operator++() { 
     --remaining; 
     return *this; 
    } 
    flipflop_iterator operator++(int) { 
     flipflop_iterator tmp(*this); 
     ++(*this); 
     return tmp; 
    } 
    bool operator*() const { 
     return (remaining + offset) % 2; 
    } 
    bool operator==(const flipflop_iterator &rhs) const { 
     return remaining == rhs.remaining; 
    } 
    bool operator!=(const flipflop_iterator &rhs) const { 
     return !(*this == rhs); 
    } 
}; 

std::vector<bool> v(flipflop_iterator(100), flipflop_iterator(0)); 

はあなたが前方反復子のランダムアクセスイテレータの代わりflipflop_iteratorを行うことで性能向上を得ることができる:あなたがflipflop_iteratorのうち、他のいくつかの使用を得ることができるかどうかはgenerate_nと比較することにより、これがやって唯一の価値があることを、おそらく明らかですしかし、私はこれらのメンバ関数すべてを書き留めるように気にすることはできません。その場合は、boost::counting_iteratorboost::transform_iteratorから構築する方がよいでしょう。

関連する問題