Инициализировать встроенный вектор 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;
}

Единственное изменение, которое я сделал в этом коде, это использование std::vector вместо вектора, и теперь у меня есть:

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

Он говорит мне использовать ; после m_allFalse. Как я могу избавиться от этой ошибки?

Я использую компилятор Intel 14, но без С++ 11.


person www    schedule 31.07.2014    source источник
comment
Вы скомпилировали с помощью компилятора С++ 11/предоставили необходимые параметры компилятора для компиляции как С++ 11?   -  person celtschk    schedule 31.07.2014
comment
Либо компилируется нормально на gcc 4.9. Опубликуйте полный пример, который отображает сообщение об ошибке, точное сообщение об ошибке, версию вашего компилятора и способ компиляции.   -  person user657267    schedule 31.07.2014
comment
проверить обновление для универсальной инициализации   -  person Luca Davanzo    schedule 31.07.2014


Ответы (2)


Проблема в следующем:

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

неправильный синтаксис в стандартном C++. (может быть, в С++ 11, я не знаю)

Вы можете использовать этот экземпляр:

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

Если вы хотите, чтобы C++11 отредактировал ваш тег и следуйте совету @lakesh.

(*) этот конструктор описан в векторной документации:

(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);
person Luca Davanzo    schedule 31.07.2014
comment
Это определенно синтаксис С++ 11. - person celtschk; 31.07.2014
comment
Спасибо, но я компилирую на С++98. - person www; 31.07.2014
comment
@celtschk ты прав, но в теге нет C++11. - person Luca Davanzo; 31.07.2014
comment
Метод std::vector<bool> m_allFalse(5, false); дает error: expected a type specifier - person www; 31.07.2014
comment
@www: Судя по имени переменной, я предполагаю, что вы объявляете член класса (важная деталь, которая фактически противоречит тексту вашего вопроса, поскольку это означает, что вы изменили больше, чем синтаксис инициализации вектора). Если это так, редактирование моего ответа должно вам помочь. - person celtschk; 31.07.2014
comment
взгляните здесь на ожидаемый спецификатор типа: stackoverflow.com/questions/8845117/ - person Luca Davanzo; 31.07.2014

Функция, которую вы используете, была введена в C++11. Поскольку, как показывает ваше редактирование вопроса, вы компилируете как С++ 98, компилятор справедливо жалуется на это, потому что это недопустимый синтаксис С++ 98.

Для особого случая, когда все значения одинаковы, способ С++ 98 (все еще работающий в С++ 11, и для этого особого случая тоже предпочтителен) для инициализации, как упоминалось Velthune,

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

На самом деле, поскольку std::vector по умолчанию инициализирует все свои значения, а false является значением по умолчанию для bool, для этого конкретного случая вы можете даже упростить его до

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

or

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) иметь инициализатор (любого рода) при ее объявлении (за исключением статических константных членов целочисленного типа). Для нестатических переменных-членов вы должны инициализировать их при вызове конструктора, например:

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`
{
}
person celtschk    schedule 31.07.2014
comment
Тогда каково решение для инициализации логических значений в начале? - person www; 31.07.2014
comment
Если все значения совпадают, используйте замену, предоставленную Velthune. В противном случае единственное, что вы можете сделать, это скопировать данные в вектор (либо с помощью отдельных выражений push_back или присваивания, либо сначала определив обычный массив с этими значениями, а затем используя std::copy, чтобы получить значения в вектор). - person celtschk; 31.07.2014