Инициализация простого вектора bool в c ++ не выполняется

SuzLy спросил: 28 марта 2018 в 02:41 в: c++

Я пытаюсь инициализировать простой вектор с ложными значениями, а затем использовать его. Я rellized значение никогда не 0 или 1, поэтому я его распечатал. В результате даже в начале он имеет странные большие значения. Я компилирую с g ++ (GCC) 4.4.7. Вопрос относится к печати только векторных данных типа bool.

Что я сделал:

std::vector<bool> n;
int f = 0;
for(f = 0; f<10; f++)
    n.push_back(false);
for(f = 0; f<10; f++)
    printf("content of %d %d",f,n[f]);

Что Я получил:

content of 0 30572784
content of 1 30572784
content of 2 30572784
content of 3 30572784
content of 4 30572784
content of 5 30572784
content of 6 30572784
content of 7 30572784
content of 8 30572784
content of 9 30572784

Что я делаю неправильно?


2 ответа

Есть решение
gchen ответил: 28 марта 2018 в 03:37

Проблема в том, что %d для int (32 бита), но для того, чтобы сделать vector из bool более эффективным, - это специализированный класс, который хранит bool как отдельный бит с использованием прокси-класса. И vector<bool> фактически возвращает ссылку на этот прокси-класс (http://en.cppreference.com/w/cpp/container/vector_bool)

, если вы хотите использовать operator [], вам нужно сначала привести его к bool

for(f = 0; f<10; f++)
    printf("content of %d %d",f,bool(n[f]));

Или, как уже упоминалось в комментариях, использовать printf в C ++.

cout << "content of " << f <<" " << n[f];

Если вы хотите увидеть true / false, вы также можете использовать cout

cout << boolalpha << "content of " << f <<" " << n[f]; //will see true/false
crack_iT ответил: 28 марта 2018 в 03:18

Чтобы инициализировать вектор bool, вы можете использовать конструктор заполнения, как указано в документации http://www.cplusplus.com/reference/vector/vector/vector/

std::vector<bool> n(10, false); (*)