初始化内联布尔向量

7

我使用这个例子来初始化布尔向量:

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

int main() {
 map<int, vector<bool> > myMap;
 vector<bool> one {true, true, false};
 myMap[2] = one;
 cout << myMap[2][0] << endl;
 cout << myMap[2][1] << endl;
 cout << myMap[2][2] << endl;
 return 0;
}

我在这段代码中唯一的更改是使用了std::vector替代vector,现在代码如下:

std::map<int, std::vector<bool> >  m_links;
std::vector<bool> m_allFalse {false, false, false, false, false};

它告诉我在 m_allFalse 后使用;。我该如何消除这个错误?我正在使用 Intel 编译器 14,但没有使用 C++11。

std::vector<bool> m_allFalse = {false, false, false, false, false}; - OMGtechy
你是否使用C++11编译器进行编译/提供了必要的编译选项以进行C++11编译? - celtschk
4
在gcc 4.9上,两种代码都可以正常编译。请提供一个完整的示例,其中包括错误消息、确切的错误信息、您的编译器版本以及如何进行编译。 - user657267
检查通用初始化的更新 - Luca Davanzo
2个回答

20
问题是:
std::vector<bool> m_allFalse {false, false, false, false, false};

在标准C++中语法错误。(也许在C++11中,我不确定)

您可以使用此实例:

std::vector<bool> m_allFalse(5, false); (*)

如果您想使用 C++11,请编辑您的标签并遵循 @lakesh 的提示。

(*) 这个构造函数在 vector 文档中有解释:

(2) 填充构造函数:用 n 个元素构造一个容器。每个元素都是 val 的副本。

要在开头初始化通用布尔值,可以使用以下方法:

bool tempBool[] = { true, false, false, true };
std::vector<bool> variousBool ( tempBool, tempBool + sizeof(tempBool) / sizeof(bool) );

了解这些后,您可以创建自己的向量类,只需从向量继承(如果需要,可以使用模板扩展到所有类型):

class PimpedVector : public std::vector<bool>  {
public:
  PimpedVector(const unsigned int& size, ...) {
    va_list args;
    va_start(args, size); 
    for ( size_t i = 0; i < size; ++i ) {
      bool b = va_arg(args, bool);
      this->push_back(b);
    }
  }
}

所以从您的主要程序中,您可以通过以下方式创建一个PimpedVector:
PimpedVector p0(5, true, false, false, true, false);

4
这明显是C++11语法。 - celtschk
谢谢,但我正在使用c++98进行编译。 - www
@celtschk 您是正确的,但在该标签中没有C++11。 - Luca Davanzo
1
std::vector<bool> m_allFalse(5, false); 方法出现了错误:期望一个类型说明符。 - www
从变量名来看,我猜你正在声明一个类成员(这是一个非常重要的细节,实际上与你的问题文本相矛盾,因为它意味着你改变了更多的向量初始化语法)。如果是这样的话,那么对我的答案进行编辑应该会帮助你。 - celtschk
请查看此处关于“expected a type specifier”的内容:https://dev59.com/aGox5IYBdhLWcg3w_JPd - Luca Davanzo

6
你所使用的功能是在C++11中引入的。由于你的问题编辑显示,你正在编译为C++98,因此编译器会正确地抱怨它,因为它不是有效的C++98语法。
对于所有值都相同的特殊情况,C++98的初始化方式(在C++11中仍然有效,并且在这种特殊情况下也更受欢迎)如Velthune所提到的。
std::vector<bool> m_allFalse(5, false);

实际上,由于std::vector默认初始化其所有值,并且falsebool的默认值,对于这种特定情况,甚至可以简化为

std::vector<bool> m_allFalse(5);

如果你想要更加通用的值,你需要将它们复制进来,例如:
std::vector<bool> foo(3);
foo[0] = foo[1] = true;
foo[2] = false; // that line is actually not needed because of default initialization of members

或者

std::vector<bool> foo;
foo.push_back(true);
foo.push_back(true);
foo.push_back(false); // this time, it is needed because it actually created the thirs argument

另外需要注意的是,我注意到你的变量名有 m_ 前缀;这表明你正在声明一个成员变量(如果是这样,那么这是你遗漏的重要细节)。在 C++98 中,成员变量不能在其声明时(除了整数类型的静态常量成员)被赋予任何形式的初始化值。对于非静态成员变量,你必须在构造函数调用时对它们进行初始化,例如:

class X
{
public:
  X(); // the constructor
private:
  std::vector<bool> m_Foo;
};

// constructor definition follows
X::X():
  m_Foo(5, false) // this initializes your member variable `m_Foo`
{
}

那么在开始时初始化布尔值的解决方案是什么? - www
如果所有的值都相同,使用Velthune提供的替换。否则,你唯一能做的就是将数据复制到向量中(可以通过单个push_back或赋值表达式,也可以通过首先定义一个具有这些值的传统数组,然后使用std::copy将值放入向量中)。 - celtschk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接