std::set::find медленней std::set::insert
От: Аноним  
Дата: 19.08.09 07:02
Оценка:
задача: в массиве найти первое повторяющееся значение.


#include <set>
#include <iostream>
#include <windows.h>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int *arr = new int[3000000];
    for (int i = 0; i < 3000000; i++)
    {
        if (i == 1000000)
        {
            arr[i] = i - 1;
            continue;
        }
        arr[i] = i;
    }
    set<int>*uinarr = new set<int>();
    size_t set_size = 0;
    DWORD start = ::GetTickCount();
    for (int j = 0; j < 3000000; j++)
    {
        //вариант №1
        /*if (uinarr->find(arr[j]) != uinarr->end())
        {
            cout<<set_size<<"; "<<arr[j]<<endl;
            break;
        }
        uinarr->insert(arr[j]);*/
        
        //вариант №2
        uinarr->insert(arr[j]);
        if (set_size == uinarr->size())
        {
            cout<<set_size<<"; "<<arr[j]<<endl;
            break;
        }
        set_size = uinarr->size();
    }
    DWORD stop = ::GetTickCount() - start;
    cout<<"time:"<<stop<<endl;
    delete uinarr;
    delete []arr;
    system("pause");
    return 0;
}

1-й вариант ~2125 мс
2-й вариант ~1096 мс
почему 1-й вариант работает медленней?
Параллельный вопрос: как ускорить удаление std::set ? предварительное set::clear() ускорения не дает
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.