Я читаю об алгоритмах STL, и книга указала, что алгоритмы типа find используют цикл while, а не цикл for, потому что он минимален, эффективен и использует на одну переменную меньше. Я решил провести некоторое тестирование, и результаты на самом деле не совпали.
forfind стабильно работал лучше, чем whilefind. Сначала я просто протестировал, вставив обратно 10000 целых в вектор, а затем использовал find, чтобы получить из него одно значение и вернуть его итератору. Я рассчитал это и вывел это время.
Затем я решил изменить его так, чтобы функции forfind и whilefind использовались несколько раз (в данном случае 10000 раз). Тем не менее, поиск for по-прежнему имеет лучшую производительность, чем find. Кто-нибудь может объяснить это? Вот код
#include "std_lib_facilities.h"
#include<ctime>
template<class ln, class T>
ln whilefind(ln first, ln last, const T& val)
{
while (first!=last && *first!=val) ++first;
return first;
}
template<class ln, class T>
ln forfind(ln first, ln last, const T& val)
{
for (ln p = first; p!=last; ++p)
if(*p == val) return p;
return last;
}
int main()
{
vector<int> numbers;
vector<int>::iterator whiletest;
vector<int>::iterator fortest;
for (int n = 0; n < 10000; ++n)
numbers.push_back(n);
clock_t while1 = clock(); // start
for (int i = 0; i < 10000; ++i)
whiletest = whilefind(numbers.begin(), numbers.end(), i);
clock_t while2 = clock(); // stop
clock_t for1 = clock(); // start
for (int i = 0; i < 10000; ++i)
fortest = forfind(numbers.begin(), numbers.end(), i);
clock_t for2 = clock(); // stop
cout << "While loop: " << double(while2-while1)/CLOCKS_PER_SEC << " seconds.\n";
cout << "For loop: " << double(for2-for1)/CLOCKS_PER_SEC << " seconds.\n";
}
Цикл while последовательно сообщает, что занимает около 0,78 секунды, а цикл for - 0,67 секунды.