Разница между стилями перебора векторов и других контейнеров stl - PullRequest
0 голосов
/ 31 января 2019

Предположим, что есть контейнер stl, для простоты я собираюсь использовать вектор, объявленный как

Получив ответ, я понял, что это потому, что я на самом деле не перебрал intно пользовательский шаблон структуры данных T, просто вносящий изменения, чтобы кому-то в будущем было легче понять.

std::vector <T> vec;

Теперь есть два распространенных метода для его перебора.

1.

for(std::vector<T>::iterator it = vec.begin(); it != vec.end(); ++it)
{
    /* std::cout << *it; ... */
}

2.

for(T t: vec)
{
    /* std::cout << t; ... */
}

Теперь я всегда предполагал, что оба эти метода были более или менее одинаковыми под капотом и должны были иметь одинаковое время выполнения, но недавно в соревновании по хакерству второй (Мой обычный Goto) дал TLE в последнем тестовом примере.и просто переключившись на первый метод, мне удалось пропустить все случаи, пропустил ли я что-то, что отличает их, или это было просто совпадение (поскольку фактическая разница между временем их выполнения была незначительной, просто на другой стороне предела).Я не смог ничего найти, поэтому, если у вас есть какие-либо ссылки или идеи, пожалуйста, поделитесь.

1 Ответ

0 голосов
/ 31 января 2019

Это делает копию переменной из вектора в t:

for(int t: vec)
{
    /* std::cout << t; ... */
}

Для int Я не думаю, что это будет большая разница.

Ноесли вы используете класс с конструкторами копирования, ... вы можете попробовать использовать ссылку:

for(int& t: vec)
{
    /* std::cout << t; ... */
}

И если она не изменяет переменную, используйте const int&

...