find не принимает value_type, оно принимает const value_type &. Я бы сказал, что для unsigned int это не должно иметь значения. Однако вполне возможно, что ваш оптимизатор просто не заметил этого и не смог правильно оптимизировать тело вашего цикла.
Edit: Я бы сказал, что вы вроде как лжете компилятору, используя цикл for. Вы можете переписать его как
typename Vec::iterator i, end;
i = vec.begin();
end = vec.end();
while(i != end && *i != val)
i++;
return i;
Конечно, парень, написавший std :: find, точно знает, насколько умным является оптимизатор, и с чем он может и не может справиться.
Редактировать: я провел ваш тест на моей машине. Это i7 930, без разгона в Visual Studio 2010. Я заменил boost :: progress_timer высокопроизводительным счетчиком.
__int64 frequency, begin, end;
QueryPerformanceCounter(frequency);
double d;
QueryPerformanceCounter(begin);
iter found=find1(vec, vec.capacity());
QueryPerformanceCounter(end);
d = ((end - begin) / (double)frequency) * 1000000;
cout << "first search required: " << d << endl;
cout << "first search found value: " << value_found(vec, found)<< endl;
QueryPerformanceCounter(begin);
found=find2(vec, vec.capacity());
QueryPerformanceCounter(end);
d = ((end - begin) / (double)frequency) * 1000000;
cout << "second search required: " << d << endl;
cout << "second search found value: " << value_found(vec, found)<< endl;
Говорит, что им обоим потребовалось 0,24 (примерно) наносекунды для работы, то есть разницы нет. Мое предложение состоит в том, что ваш оптимизатор является незрелым, и что ваша версия std :: find написана именно для того, чтобы представить правильные оптимизации, тогда как ваша находка просто не помечает правильные поля оптимизации.
Редактировать: Ваши данные о времени явно сбиты. Мой i7 работает за 0,23 наносекунды, то есть 0,00000023 секунды, тогда как ваш - 0,008 секунды. Если мой i7 примерно в 40000 раз быстрее, чем ваш, нет никакого способа. Нет никакого способа, которым i7 займет столько времени, чтобы пройти только десять миллионов предметов. Конечно, я на самом деле использую 64-битную Windows 7, хотя в 64-битном режиме не компилировался.
Собираюсь выложить дизассемблер сейчас.
FIND1:
00F810D3 mov esi,dword ptr [esp+34h]
00F810D7 mov eax,dword ptr [esp+3Ch]
00F810DB mov ecx,dword ptr [esp+38h]
00F810DF sub eax,esi
00F810E1 sar eax,2
00F810E4 cmp esi,ecx
00F810E6 je main+0B3h (0F810F3h)
00F810E8 cmp dword ptr [esi],eax
00F810EA je main+0B3h (0F810F3h)
00F810EC add esi,4
00F810EF cmp esi,ecx
00F810F1 jne main+0A8h (0F810E8h)
find2:
00F8119A mov ecx,dword ptr [esp+34h]
00F8119E mov eax,dword ptr [esp+3Ch]
00F811A2 mov edx,dword ptr [esp+38h]
00F811A6 sub eax,ecx
00F811A8 sar eax,2
00F811AB cmp ecx,edx
00F811AD jae main+17Fh (0F811BFh)
00F811AF nop
00F811B0 cmp dword ptr [ecx],eax
00F811B2 je main+254h (0F81294h)
00F811B8 add ecx,4
00F811BB cmp ecx,edx
00F811BD jb main+170h (0F811B0h)
00F811BF mov esi,edx
Вы можете видеть, что find2 немного отличается от find1. Я проверил, заменив вызов find2 другим вызовом find1, который действительно производит идентичные разборки. Любопытно, что они производят разные сборки.