Если вся матрица имеет в основном постоянную ширину и высоту, вы также можете использовать одну vector
и адресовать ячейки с (row * columnCount) + column
.Таким образом, все будет храниться в одном блоке памяти, а не в нескольких фрагментированных блоках для каждой строки.(Хотя, конечно, вы делаете правильную вещь, чтобы обернуть эту концепцию в новом классе - я просто говорю о закулисной реализации.)
Вектор векторов обладает неудачным свойством, чтоесли вы вставите строку вверху, std::vector
выполнит построение копирования (или, возможно, присваивание) для всех остальных строк, поскольку оно сдвигает их вниз на одно место.Это, в свою очередь, включает перераспределение хранилища для каждой строки и индивидуальное копирование элементов в ячейках каждой строки.(C ++ 0x, вероятно, будет лучше в этом.)
Если вы знаете, что будете часто заниматься такими вещами, преимущество одного большого блока памяти состоит в том, что вы можете вставить новую строку всверху и std::vector
нужно будет только сместить все ячейки вперед на columnCount
мест, поэтому это серьезно сократит количество операций с кучей (освобождение / перераспределение отдельных блоков).
Хотя, как вы предлагаетевектор указателей на векторы будет иметь дополнительное преимущество, заключающееся в том, что ему потребуется только сдвинуть вперед много значений указателей, а размер блока, содержащего все указатели строк, будет намного меньше, что еще больше уменьшит влияние операций кучи.
Конечно, единственный способ убедиться в реальном влиянии этих вещей на производительность приложения - это рассчитать время его выполнения и сравнить его с различными реализациями.Вот почему вы делаете все правильно, скрывая эти детали в новом классе.