初始化bool的内联向量

www*_*www 6 c++ vector c++98

我正在使用此示例初始化bool向量:

#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;
}
Run Code Online (Sandbox Code Playgroud)

我在这段代码中唯一的变化是使用std::vector而不是vector而我现在有:

std::map<int, std::vector<bool> >  m_links;
std::vector<bool> m_allFalse {false, false, false, false, false};
Run Code Online (Sandbox Code Playgroud)

它告诉我使用;之后m_allFalse.我怎样才能摆脱这个错误?

我使用的是intel编译器14,但没有使用c ++ 11.

Luc*_*nzo 14

问题是:

std::vector<bool> m_allFalse {false, false, false, false, false};
Run Code Online (Sandbox Code Playgroud)

标准C++中的语法错误.(也许在C++ 11中,我不知道)

您可以使用此实例:

std::vector<bool> m_allFalse(5, false); (*)
Run Code Online (Sandbox Code Playgroud)

如果你想要C++ 11编辑你的标签并按照@lakesh提示.

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

(2)fill构造函数构造一个包含n个元素的容器.每个元素都是val的副本.

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

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

知道了这一点,你可以创建自己的vector类,只需从vector继承(如果你想要你可以使用模板扩展到所有类型):

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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

PimpedVector p0(5, true, false, false, true, false);
Run Code Online (Sandbox Code Playgroud)

  • 它绝对是C++ 11语法. (4认同)

cel*_*chk 6

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

对于所有值都相同的特殊情况,C++98 的初始化方式(在 C++11 中仍然有效,对于这种特殊情况也是首选),如 Velthune 所提到的,

std::vector<bool> m_allFalse(5, false);
Run Code Online (Sandbox Code Playgroud)

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

std::vector<bool> m_allFalse(5);
Run Code Online (Sandbox Code Playgroud)

如果您想要更通用的值,则必须将它们复制进去,例如:

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
Run Code Online (Sandbox Code Playgroud)

或者

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
Run Code Online (Sandbox Code Playgroud)

附加说明:我注意到m_你的变量名的前缀;这表明您正在声明一个成员变量(如果是这样,那么这是您遗漏的一个关键细节)。成员变量(在 C++98 中)不能在其声明时指定初始值设定项(任何类型)(整数类型的 static 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`
{
}
Run Code Online (Sandbox Code Playgroud)