C++11 std:: array vs static array vs std:: вектор
первый вопрос: Хорошо ли начинать использовать c++11, если я буду разрабатывать код в течение 3 следующих лет?
тогда, если это так, каков "лучший" способ реализовать матрицу, если я хочу использовать ее с Lapack? Я имею в виду, делать std::vector<std::vector< Type > > Matrix
не легко совместим с Lapack.
до сих пор я хранил свою матрицу с Type* Matrix(new Type[N])
(форма указателя с new
и delete
были важны, потому что размер массива не задается как число, подобное 5,а как переменная).
но с C++11 можно использовать std:: array. Согласно этому сайт этот контейнер, кажется, лучшее решение... А ты как думаешь?
2 ответов
во-первых, если вы собираетесь изучать C++, изучите C++11. Предыдущий стандарт C++ был выпущен в 2003 году, что означает, что он уже десять лет. Это много в мире IT. Навыки C++11 также плавно переведутся на предстоящий стандарт C++1y (скорее всего, C++14).
основное различие между std::vector
и std::array
- это динамическое (по размеру и распределению) и статическое хранилище. Поэтому, если вы хотите иметь матричный класс, который всегда, скажем, 4x4,std::array<float, 4*4>
все будет хорошо.
оба этих класса обеспечивают .data()
член, который должен создавать совместимый указатель. Заметьте, однако, что std::vector<std::vector<float>>
не будет occuppy смежных 16*sizeof(float)
память (т. v[0].data()
не работы). Если вам нужна матрица динамического размера, используйте single vector
и измените его размер на width*height
размер.
так как доступ к элементам будет немного сложнее (v[width * y +x]
или v[height * x + y]
), вы можете предоставить класс-оболочку, который позволит вы получите доступ к произвольному полю по паре строк / столбцов.
поскольку вы также упомянули массивы C-style;std::array
обеспечивает более приятный интерфейс для работы с одним и тем же типом хранилища и, следовательно, должен быть предпочтительным; нет ничего, чтобы получить со статическими массивами над std::array
.
это очень поздний ответ на вопрос, но если кто-то читает это, я просто хочу указать, что почти никогда не следует реализовывать матрицу как "вектор векторов". Причина в том, что каждая строка матрицы хранится в некотором случайном месте в куче. Это означает, что матричные операции будут делать много случайных обращений к памяти, приводящих к пропускам кэша, что значительно замедляет реализацию.
другими словами, если вы заботитесь о производительности, просто выделить array/std::array/std::vector
в размере rows * columns
, затем используйте функции-оболочки, которые преобразуют пару целых чисел в соответствующий элемент массива. Если вам не нужно поддерживать такие вещи, как возврат ссылок на строки матрицы, все эти параметры должны работать нормально.