Здравствуйте, Serg27, Вы писали:
S>Здравствуйте, Anton_Savickiy, Вы писали:
A_S>>Я еще на курсах только... Все так плохо?
S>Да, нет. Вроде все на лету схватываете. Просто сразу видно, что Вы последовательно C++ еще не изучали. Поэтому почти каждый и посоветовал почитать учебник. Желательно с начала. Если изучаете самостоятельно, то попробуйте хотя бы какой-либо онлайн курс. На Coursera вроде был курс типа "C++ для программистов С".
Спасибо большое за рекомендации, посмотрю какой-нибудь онлайн курс. С++ для меня в мере, которой заложил его Страуструпп, неизведан.
Да и запутал я, как вижу по ответам, да и сам запутался. Поэтому, собственно и создал тему.
Заметил, наверное, ожидаемую плату за абстракцию.
1)Попробовал отсортировать массив базового типа int.
#define NUM 10000
vector<int> vecX(arr,arr+NUM);
sort(vecX.begin(), vecX.end());
и отсортировал обычной сортировкой вставками, так сказать в лоб.
#define NUM 10000
void selectSort(int* ptr,int size)
{
int tmp, i, j, pos;
for(i = 0; i < size; ++i)
{
pos = i;
tmp = ptr[i];
for(j = i + 1; j < size; ++j)
{
if (ptr[j] < tmp)
{
pos = j;
tmp = ptr[j];
}
}
ptr[pos] = ptr[i];
ptr[i] = tmp;
}
}
selectSort(arr,NUM);
STL time = 2ms
selectSort time = 49ms
2) А теперь отсортируем структуры.
a) STL
struct DATA
{
int cmd;
float var;
};
struct DATA_C
{
FILETIME ft;
DATA dt[1000];
};
struct sort_rule
{
bool operator() (DATA_C i, DATA_C j)
{return (CompareFileTime(&i.ft,&j.ft)==-1) ? true:false;}
} sort_object;
DATA_C d[NUM];
SYSTEMTIME st;
GetLocalTime(&st);
for(int i=0;i<NUM;i++)
{
st.wMilliseconds = (WORD)rand()%1000;
SystemTimeToFileTime(&st,&d[i].ft);
}
vector<DATA_C> vecObj(d,d+NUM);
sort(vecObj.begin(), vecObj.end(),sort_object);
b) selectSort
void selectSortS(DATA_C* ptr,int size)
{
DATA_C tmp;
int idx;
for(int i=0;i<size;++i)
{
idx = i;
memcpy(&tmp,&ptr[i],sizeof(DATA_C));
for(int j=i+1;j<size;++j)
{
if(CompareFileTime(&ptr[j].ft,&tmp.ft)==-1)
{
idx = j;
memcpy(&tmp,&ptr[j],sizeof(DATA_C));
}
}
memcpy(&ptr[idx],&ptr[i],sizeof(DATA_C));
memcpy(&ptr[i],&tmp,sizeof(DATA_C));
}
}
selectSortS(d,NUM);
А вот тут уже результат совсем другой. Да, сортируются всегда одинаковые массивы.
STL time = 1209ms
selectSortS time = 911ms
Конечно можно усреднить и посмотреть детальнее, но тенденция понятна.
Существуют ли какие-нибудь методы оптимизации? Или это плата за абстракцию?
Спасибо.