std::vector< bool >
упаковывает его содержимое, поэтому каждое булево значение хранится в одном бите, восемь бит - в байт. Это эффективно с точки зрения памяти, но вычислительно интенсивно, так как процессор должен выполнить арифметику для доступа к запрошенному биту. И это не работает с bool
ссылкой или семантикой указателя, поскольку биты внутри байта не имеют адресов в объектной модели C ++.
Вы все же можете объявить переменную типа std::vector<bool>::reference
и использовать как будто это было bool&
. Это позволяет универсальным алгоритмам быть совместимыми.
std::vector< bool > bitvec( 22 );
std::vector< bool >::reference third = bitvec[ 2 ];
third = true; // assign value to referenced bit
В C ++ 11 вы можете обойти это с помощью auto
и спецификатора &&
, который автоматически выбирает ссылку на lvalue, привязанную к векторному элементу или ссылку rvalue, привязанную к временному.
std::vector< bool > bitvec( 22 );
auto &&third = bitvec[ 2 ]; // obtain a std::vector< bool >::reference
third = true; // assign value to referenced bit
У вас сбой в компиляторе, что раздражает. Лучший способ зарегистрировать ошибку - максимально уменьшить ее.
Лучший способ сделать это с помощью программы Creduce . Это программа, которая требует файл и скрипт. Файл - ваша стартовая ситуация. Сценарий должен доказать, что ваша ошибка все еще существует.
В этом случае ваш сценарий может существовать для 2 команд компиляции и проверки кода возврата. Файл просто ваш .CPP
При всем этом программа выбросит код ... и максимально уменьшит размер файла. Я видел, как 100 000 строк были сокращены до 5.
Трюки: предварительно обработанные файлы имеют больший размер, хотя и являются автономными, поэтому их проще уменьшить.
Наконец, вам нужно много времени. Вы запускаете его, и он работает до тех пор, пока он не уменьшится
Если он выполняется менее чем за пять минут, ваш скрипт неисправен, и у вас обычно получается пустой .CPP Ожидаемое время находится в диапазоне часов.