Я согласен с другими комментариями, что использование векторов является гораздо более безопасным способом решения вашей проблемы: использование массивов напрямую определенно подвержено ошибкам. Конечно, если ваше упражнение требует использования массивов, то вы должны использовать массивы.
Что касается производительности, я написал небольшой тест с использованием g ++ на Ubuntu 10.04. Запуск
г ++ - версия
Я получаю
g ++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3
Моя тестовая программа создает матрицу 100x100 и устанавливает для каждого элемента определенное значение. Сначала у него есть несколько объявлений:
#include <vector>
#include <iostream>
#include "util.h" // Timer utilities.
#define LINE_COUNT (100) // The number of lines.
#define COL_COUNT (100) // The number of columns.
#define REPETITIONS (100000) // Number of repetitions for each test.
using namespace std;
Тогда у меня есть тест с использованием векторов:
void use_vectors()
{
int line = LINE_COUNT;
int member = COL_COUNT;
vector<vector<int> > matrix(line, vector<int>(member));
// Set data.
for (int i = 0; i < line; i++)
{
for (int j = 0; j < member; j++)
{
matrix[i][j] = -5;
}
}
}
Тогда у меня есть функция для выполнения того же теста (создание матрицы и установка значений) с использованием массивов:
void use_arrays()
{
int line = LINE_COUNT;
int member = COL_COUNT;
int **matrix;
matrix = new int * [line];
for (int i = 0; i < line; i++)
{
matrix[i] = new int[member];
}
// Set data.
for (int i = 0; i < line; i++)
{
for (int j = 0; j < member; j++)
{
matrix[i][j] = -5;
}
}
for (int i = 0; i < line; ++i)
{
delete [] matrix[i];
}
delete [] matrix;
}
Основная программа повторяет оба теста и записывает время, необходимое для каждого из них. Вот основная программа:
main()
{
long int es = 0;
long int eu = 0;
start_timer();
for (int i = 0; i < REPETITIONS; i++)
{
use_vectors();
}
stop_timer();
es = elapsed_sec();
eu = elapsed_usec();
cout << "Vectors needed: " << es << " sec, " << eu << " usec" << endl;
start_timer();
for (int i = 0; i < REPETITIONS; i++)
{
use_arrays();
}
stop_timer();
es = elapsed_sec();
eu = elapsed_usec();
cout << "Arrays needed: " << es << " sec, " << eu << " usec" << endl;
}
Функции таймера основаны на библиотечной функции gettimeofday () (см., Например, http://linux.die.net/man/2/gettimeofday).
Результат следующий:
Vectors needed: 24 sec, 624416 usec
Arrays needed: 10 sec, 16970 usec
Так что у векторов есть некоторые накладные расходы на массивы. Или я могу сделать что-то, чтобы улучшить производительность векторов? Я несколько раз проверил свой тестовый код, и мне кажется, я понял его правильно.
Во всяком случае, я бы ни в коем случае не советовал использовать массивы только для увеличения производительности, если это действительно не имеет большого значения в вашем приложении.