Вчера у меня был тест, используй [] против итератора, код создает вектор с некоторыми элементами и удаляет некоторые элементы из вектора.
Этот код использует оператор [] для доступа к элементам
TimeSpent([](){
std::vector<int> vt = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
for (int i = int(vt.size()) - 1; i >= 0; i--)
{
if (vt[i] % 2 == 0)
{
//cout << "removing " << vt[i] << endl;
vt.erase(vt.begin() + i);
}
}
});
Следующий код относится к элементам вектора доступа с использованием итератора
TimeSpent([](){
std::vector<int> vt = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
for (std::vector<int>::iterator num = vt.begin(); num != vt.end();)
{
if (*num % 2 == 0)
{
num = vt.erase(num);
}
else
{
++num;
}
}
});
Проверено путем вызова их этой функцией отдельно
void TimeSpent(std::function<void()> func)
{
const int ONE_MIL = 10000;
long times = ONE_MIL;
std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
while (times > 0)
{
func();
--times;
}
std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
cout << "time elapsed : " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << endl;
}
Тестируемой средой является Visual Studio 2013 Pro. версия 4.5.51650
Результаты:
оператор []: 192
итератор: 212
Резюме: когда мы получаем доступ к векторному контейнеру, operator [] работает быстрее, чем итератор.