【问题标题】:Initialize inline vector of bool初始化 bool 的内联向量
【发布时间】:2014-07-31 08:38:19
【问题描述】:

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

#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 而不是向量,我现在有了:

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&lt;bool&gt; m_allFalse = {false, false, false, false, false};
  • 您是否使用 C++11 编译器进行编译/提供了编译为 C++11 所需的编译器选项?
  • 在 gcc 4.9 上都可以正常编译。发布一个完整的示例,显示错误消息、确切的错误消息、您的编译器版本以及您的编译方式。
  • 检查通用初始化更新

标签: c++ vector c++98


【解决方案1】:

问题是:

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

标准 C++ 中的语法错误。 (可能在 C++11 中,我不知道)

你可以使用这个实例:

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

如果你想要 C++11 编辑你的标签并遵循@lakesh 提示。

(*) 这个构造函数在向量documentation中解释:

(2) 填充构造函数构造一个包含 n 个元素的容器。每个 element 是 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);
    }
  }
}

因此,您可以通过这种方式从您的 main 创建一个 PimpedVector:

PimpedVector p0(5, true, false, false, true, false);

【讨论】:

  • 绝对是C++11语法。
  • 谢谢,但我正在使用 c++98 编译。
  • @celtschk 你是对的,但在标签中没有 C++11。
  • std::vector&lt;bool&gt; m_allFalse(5, false); 方法给出error: expected a type specifier
  • @www:从变量名来看,我猜你是在声明一个类成员(这个关键细节实际上与你的问题文本相矛盾,因为这意味着你改变的不仅仅是向量初始化语法)。如果是这样,对我的答案的编辑应该会对您有所帮助。
【解决方案2】:

您使用的功能是在 C++11 中引入的。因为,正如您的问题编辑所揭示的那样,您正在编译为 C++98,编译器理所当然地抱怨它,因为它不是有效的 C++98 语法。

对于所有值都相同的特殊情况,如 Velthune 所述,初始化的 C++98 方式(仍在 C++11 中工作,并且对于这种特殊情况也首选)初始化,

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_ 前缀;这表明您正在声明一个 member 变量(如果是这样,这是您遗漏的关键细节)。一个成员变量(在 C++98 中)不能在其声明时被赋予一个初始化器(任何类型的)(整数类型的静态 const 成员除外)。对于非静态成员变量,必须在构造函数调用时对其进行初始化,例如:

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`
{
}

【讨论】:

  • 那么一开始初始化布尔值的解决方法是什么?
  • 如果所有值都相同,请使用 Velthune 给出的替换。否则,您唯一能做的就是将数据复制到向量中(通过单独的 push_back 或赋值表达式,或者首先使用这些值定义一个常规数组,然后使用 std::copy 将值放入向量中)。
猜你喜欢
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多