C++ 如何初始化值为01的向量?

C++ 如何初始化值为01的向量?,c++,vector,constructor,C++,Vector,Constructor,我可以初始化一个向量以010101…等序列开始吗?或者我必须用0初始化它并循环通过,然后每隔一个值更改为1吗?看看。看看。你可以试试这样的方法 #include<vector> #include<iostream> using namespace std; int main() { bool bool_array[] = {true,false,true,false,true,false,true,false}; vector<bool> b

我可以初始化一个向量以010101…等序列开始吗?或者我必须用0初始化它并循环通过,然后每隔一个值更改为1吗?

看看。

看看。

你可以试试这样的方法

#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;
}

你可以试试这样的

#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;
}

要扩展@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); });

要扩展@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); });

受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;
}

受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;
}

另一种可能是未测试的代码可能有bug。它基本上与mos的generate_n相同,但路线不同。很明显,与生成相比,只有当您能够从触发器迭代器中获得一些其他用途时,才值得这样做:


通过将flipflop_迭代器改为随机访问迭代器而不是前向迭代器,可以提高性能,但我不想费心写出所有这些成员函数。在这种情况下,最好使用boost::counting_迭代器和boost::transform_迭代器来构建它。

另一种未经测试的代码可能有缺陷。它基本上与mos的generate_n相同,但路线不同。很明显,与生成相比,只有当您能够从触发器迭代器中获得一些其他用途时,才值得这样做:


通过将flipflop_迭代器改为随机访问迭代器而不是前向迭代器,可以提高性能,但我不想费心写出所有这些成员函数。在这种情况下,最好使用boost::counting_迭代器和boost::transform_迭代器来构建它。

使用执行此操作的构造函数而不是使用insert会更快吗?这是一个大的向量。使用这样做的构造函数而不是使用insert会更快吗?这是一个很大的向量。如果向量已经有大小,您可以使用std::generate,尽管您不必这样做,但您可能希望先保留一个大小为0的向量。因为非C++11示例很有可能被复制粘贴到某个地方,让生成器函子成为命名类型而不是匿名类型的实例可能是一个好主意,这样如果它被重用,它就不会“记住”上次使用时的状态,而且它应该至少有一个用户指定的构造函数,即使它是用户定义的默认构造函数,所以b一定会被初始化。这很公平。初始化步骤绝对是我跳过的必要步骤,因为我很困,很懒如果向量已经有大小,您可以使用std::generate,尽管您不必这样做,但您可能希望先保留一个大小为0的向量。因为非C++11示例很有可能被复制粘贴到某个地方,让生成器函子成为命名类型而不是匿名类型的实例可能是一个好主意,这样如果它被重用,它就不会“记住”上次使用时的状态,而且它应该至少有一个用户指定的构造函数,即使它是用户定义的默认构造函数,所以b一定会被初始化。这很公平。初始化步骤绝对是我跳过的必要步骤,因为我很困,很懒