2-мерный ... массив ... размера num_a * num_b
... Из-за своего размера его необходимо распределить в куче.Он должен быть непрерывным в памяти
std::vector<std::vector<bool>>
В векторе векторов строки являются смежными внутри себя, но не по отношению друг к другу.Это то же самое, что и массив указателей.Таким образом, это не удовлетворяет вашу потребность в непрерывной компоновке.
new std::vector<std::vector<bool>>()
Вряд ли когда-либо возникает необходимость динамически выделять такой вектор.Лучше избегать из соображений правильности и производительности.
Единственное решение для выделения непрерывного массива с динамическим размером - это выделение одномерного массива, где строки расположены ровно одна за другой.другой.Например:
std::vector<bool> matrix(num_a * num_b);
Вы можете получить доступ к элементу [a] [b] по индексу a + num_a * b
.
Обратите внимание, что std::vector<bool>
очень особенный и отличаетсяиз других векторов.Он не содержит bool
объектов, а биты упакованы и доступны через маскирование и сдвиг 1 .Это делает структуру данных очень удобной для кэширования, но операции более сложными.Хорошо это или плохо для производительности, зависит от того, что вы делаете с ней, а также от архитектуры процессора.
Более важно, чем соображение производительности, это означает, что некоторые гарантии, на которые вы можете положиться с другими массивами, не 'т применяется к std::vector<bool>
.Например, вы не можете взять адрес элемента, а также не можете изменять различные элементы в разных потоках без синхронизации.А что касается вашего конкретного случая, поскольку нет гарантии для объектов bool, то, безусловно, не гарантируется, что в векторе будут смежные объекты bool.
Так что, если вам нужен обычный массив bool
, вам нужнообойти специализацию при использовании вектора.Например:
enum boolean : bool {no, yes};
std::vector<boolean> matrix;
1 Технически, нет гарантии какого-либо конкретного представления.Это определенная реализация.