我可以初始化vector<bool>
以开始010101等序列吗?或者我是否必须使用0进行初始化并循环直播并将每个其他值更改为1?
答案 0 :(得分:7)
要扩展@ 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());
答案 1 :(得分:3)
看看generate。
答案 2 :(得分:2)
受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;
}
答案 3 :(得分:1)
另一种可能性(未经测试的代码,可能是错误的)。它与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
构建它可能会更好。
答案 4 :(得分: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