Как инициализировать вектор <bool>со значениями 01, повторяющимися? - PullRequest
1 голос
/ 22 февраля 2012

Могу ли я инициализировать vector<bool>, чтобы начать с последовательности 010101 ... и т. Д.?Или мне нужно просто инициализировать его с нулями и циклом и изменить каждое другое значение на 1?

Ответы [ 5 ]

7 голосов
/ 22 февраля 2012

Чтобы расширить ответ @ zmbq, используйте std::generate_n, например:

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());
3 голосов
/ 22 февраля 2012

Посмотрите на Генерировать .

2 голосов
/ 22 февраля 2012

вдохновленный 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 голос
/ 22 февраля 2012

Другая возможность (код не проверен, возможно, глючит). По сути, это то же самое, что и у Mos generate_n, но другим путем. Вероятно, очевидно, что по сравнению с generate_n это стоит делать, только если вы можете получить какое-то другое использование из flipflop_iterator:

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 итератор с произвольным доступом вместо прямого итератора, но я не могу не написать все эти функции-члены. В этом случае, вероятно, было бы лучше построить его из boost::counting_iterator и boost::transform_iterator.

0 голосов
/ 22 февраля 2012

Вы можете попробовать что-то вроде этого

#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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...