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, затем используйте функции-оболочки, которые преобразуют пару целых чисел в соответствующий элемент массива. Если вам не нужно поддерживать такие вещи, как возврат ссылок на строки матрицы, все эти параметры должны работать нормально.