std::map Вопрос по сортировки элементов
От: Anton_Savickiy  
Дата: 10.03.14 10:16
Оценка: -3
Здравствуйте товарищи!

Хочется попробовать использовать библиотеку шаблонов и вот какой возник вопрос.

Есть что-то типа вот такого:
typedef struct 
{
     int   cmd;
     float var;
}DATA;

typedef struct
{
    FILETIME ft;
    DATA data;
}DATA_FROM;

DATA_FROM df[1000];

Вот теперь хотелось бы отсортировать такой массив по FILETIME. Не подскажите, как это лучше сделать средствами STL? Пошукав, обнаружил такой инструмент, как map<string, int> M; <ключ, значение>. Но применительно к моей задачи никак не соображу. Есть еще элемент list, посоветуйте пожалуйста решение?

Спасибо.,
Re: std::map Вопрос по сортировки элементов
От: Stanislav V. Zudin Россия  
Дата: 10.03.14 10:34
Оценка: 3 (1)
Здравствуйте, Anton_Savickiy, Вы писали:

A_S>Хочется попробовать использовать библиотеку шаблонов и вот какой возник вопрос.


A_S>Есть что-то типа вот такого:


A_S>typedef struct

A_S>{
A_S> FILETIME ft;
A_S> DATA data;
A_S>}DATA_FROM;

A_S>DATA_FROM df[1000];


A_S>Вот теперь хотелось бы отсортировать такой массив по FILETIME. Не подскажите, как это лучше сделать средствами STL? Пошукав, обнаружил такой инструмент, как map<string, int> M; <ключ, значение>. Но применительно к моей задачи никак не соображу. Есть еще элемент list, посоветуйте пожалуйста решение?


std::map это контейнер, а не средство сортировки (да, в нем элементы лежат упорядоченно).

Для сортировки есть std::sort.
Чтобы его применить можно:
1. Определить operator< для DATA_FROM.
Тогда вызов будет таким:

struct DATA_FROM
{
    FILETIME ft;
    DATA data;

    bool operator<(const DATA_FROM& rv) const
    {
        return ft < rv.ft;
    }
};

std::sort(df, df + countof(df));


2. Определить компаратор. Имеет смысл, если одну и ту же сущность надо сортировать по разным критериям.
bool CompareByFileData(const DATA_FROM& df1, const DATA_FROM& df2)
{
   return df1.ft < df2.ft;
}

std::sort(df, df + countof(df), CompareByFileData);


Как-то так.

PS. О том, как сравнивать FILETIME читай в соответствующем разделе msdn.
Да, тоже порекомендую почитать учебник по С++.
_____________________
С уважением,
Stanislav V. Zudin
Re[5]: std::map Вопрос по сортировки элементов
От: Stanislav V. Zudin Россия  
Дата: 12.03.14 07:38
Оценка: 3 (1)
Здравствуйте, Anton_Savickiy, Вы писали:

A_S>2) А теперь отсортируем структуры.


A_S>a) STL

A_S>

A_S>struct sort_rule
A_S>{
A_S>    bool operator() (DATA_C i, DATA_C j)               // <-- Замени передачу по значению на ссылки
        bool operator() (const DATA_C& i, const DATA_C& j) const  // <-- Вот так
        {
             return (CompareFileTime(&i.ft,&j.ft) < 0);
        }
A_S>} sort_object;

A_S>



A_S>А вот тут уже результат совсем другой. Да, сортируются всегда одинаковые массивы.


A_S>STL time = 1209ms

A_S>selectSortS time = 911ms

A_S>Конечно можно усреднить и посмотреть детальнее, но тенденция понятна.


A_S>Существуют ли какие-нибудь методы оптимизации? Или это плата за абстракцию?

Просто неправильно готовишь.
_____________________
С уважением,
Stanislav V. Zudin
Re[3]: Re[3]: std::map Вопрос по сортировки элементов
От: Serg27  
Дата: 11.03.14 08:00
Оценка: 1 (1)
Здравствуйте, Anton_Savickiy, Вы писали:
A_S>Я еще на курсах только... Все так плохо?
Да, нет. Вроде все на лету схватываете. Просто сразу видно, что Вы последовательно C++ еще не изучали. Поэтому почти каждый и посоветовал почитать учебник. Желательно с начала. Если изучаете самостоятельно, то попробуйте хотя бы какой-либо онлайн курс. На Coursera вроде был курс типа "C++ для программистов С".
Re: std::map Вопрос по сортировки элементов
От: Abyx Россия  
Дата: 10.03.14 10:23
Оценка: +1
Здравствуйте, Anton_Savickiy, Вы писали:

A_S>Хочется попробовать использовать библиотеку шаблонов и вот какой возник вопрос.


A_S>Вот теперь хотелось бы отсортировать такой массив по FILETIME. Не подскажите, как это лучше сделать средствами STL? Пошукав, обнаружил такой инструмент, как map<string, int> M; <ключ, значение>. Но применительно к моей задачи никак не соображу. Есть еще элемент list, посоветуйте пожалуйста решение?


для сортировки есть sort.
also попробуйте прочитать учебник по программированию.
In Zen We Trust
Re[9]: std::map Вопрос по сортировки элементов
От: Аноним  
Дата: 12.03.14 19:06
Оценка: +1
Здравствуйте, Anton_Savickiy, Вы писали:

A_S>А можете навскидку озвучить что-нибудь?

http://en.wikipedia.org/wiki/List_of_performance_analysis_tools
А вообще большей частью народ пользуется Intel VTune.
Re[2]: std::map Вопрос по сортировки элементов
От: Anton_Savickiy  
Дата: 10.03.14 10:32
Оценка:
Здравствуйте, Abyx, Вы писали:

A>Здравствуйте, Anton_Savickiy, Вы писали:


A_S>>Хочется попробовать использовать библиотеку шаблонов и вот какой возник вопрос.


A_S>>Вот теперь хотелось бы отсортировать такой массив по FILETIME. Не подскажите, как это лучше сделать средствами STL? Пошукав, обнаружил такой инструмент, как map<string, int> M; <ключ, значение>. Но применительно к моей задачи никак не соображу. Есть еще элемент list, посоветуйте пожалуйста решение?


A>для сортировки есть sort.

A>also попробуйте прочитать учебник по программированию.

Я согласен с тоном Вашего ответа, попробую еще раз.

#define NUM 100000

int A[NUM];
for(int i=0;i<NUM;i++) A[i]=(int)rand();

vector<int> v(A,A+NUM);
sort(v.begin(),v.end());

Вот так мне понятно, т е в случае вектора, а если вместо вектора будет массив структур и мне нужно отсортировать по определенному элементу?
Как накормить STL? Чтобы сортировать FILETIME я бы использовал CompareFileTime? Как внутри шаблона это можно реализовать?
Re[3]: std::map Вопрос по сортировки элементов
От: Abyx Россия  
Дата: 10.03.14 10:36
Оценка:
Здравствуйте, Anton_Savickiy, Вы писали:

A_S>Здравствуйте, Abyx, Вы писали:


A>>Здравствуйте, Anton_Savickiy, Вы писали:


A_S>>>Хочется попробовать использовать библиотеку шаблонов и вот какой возник вопрос.


A_S>>>Вот теперь хотелось бы отсортировать такой массив по FILETIME. Не подскажите, как это лучше сделать средствами STL? Пошукав, обнаружил такой инструмент, как map<string, int> M; <ключ, значение>. Но применительно к моей задачи никак не соображу. Есть еще элемент list, посоветуйте пожалуйста решение?


A>>для сортировки есть sort.

A>>also попробуйте прочитать учебник по программированию.

A_S>Я согласен с тоном Вашего ответа, попробую еще раз.


A_S>#define NUM 100000


A_S>int A[NUM];

A_S>for(int i=0;i<NUM;i++) A[i]=(int)rand();

A_S>vector<int> v(A,A+NUM);

A_S>sort(v.begin(),v.end());

A_S>Вот так мне понятно, т е в случае вектора, а если вместо вектора будет массив структур и мне нужно отсортировать по определенному элементу?

A_S>Как накормить STL? Чтобы сортировать FILETIME я бы использовал CompareFileTime? Как внутри шаблона это можно реализовать?

прочитайте хотя бы справочник — http://en.cppreference.com/w/cpp/algorithm/sort
там написано что у sort есть две версии, и даже есть пример
In Zen We Trust
Re[2]: std::map Вопрос по сортировки элементов
От: Anton_Savickiy  
Дата: 10.03.14 10:45
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Здравствуйте, Anton_Savickiy, Вы писали:


A_S>>Хочется попробовать использовать библиотеку шаблонов и вот какой возник вопрос.


A_S>>Есть что-то типа вот такого:


A_S>>typedef struct

A_S>>{
A_S>> FILETIME ft;
A_S>> DATA data;
A_S>>}DATA_FROM;

A_S>>DATA_FROM df[1000];


A_S>>Вот теперь хотелось бы отсортировать такой массив по FILETIME. Не подскажите, как это лучше сделать средствами STL? Пошукав, обнаружил такой инструмент, как map<string, int> M; <ключ, значение>. Но применительно к моей задачи никак не соображу. Есть еще элемент list, посоветуйте пожалуйста решение?


SVZ>std::map это контейнер, а не средство сортировки (да, в нем элементы лежат упорядоченно).


SVZ>Для сортировки есть std::sort.

SVZ>Чтобы его применить можно:
SVZ>1. Определить operator< для DATA_FROM.
SVZ>Тогда вызов будет таким:

SVZ>
SVZ>struct DATA_FROM
SVZ>{
SVZ>    FILETIME ft;
SVZ>    DATA data;

SVZ>    bool operator<(const DATA_FROM& rv) const
SVZ>    {
SVZ>        return ft < rv.ft;
SVZ>    }
SVZ>};

SVZ>std::sort(df, df + countof(df));
SVZ>


SVZ>2. Определить компаратор. Имеет смысл, если одну и ту же сущность надо сортировать по разным критериям.

SVZ>
SVZ>bool CompareByFileData(const DATA_FROM& df1, const DATA_FROM& df2)
SVZ>{
SVZ>   return df1.ft < df2.ft;
SVZ>}

SVZ>std::sort(df, df + countof(df), CompareByFileData);
SVZ>


SVZ>Как-то так.


SVZ>PS. О том, как сравнивать FILETIME читай в соответствующем разделе msdn.

SVZ>Да, тоже порекомендую почитать учебник по С++.

Спасибо Станислав, идея понятна.
Re[3]: std::map Вопрос по сортировки элементов
От: Anton_Savickiy  
Дата: 10.03.14 11:43
Оценка:
Задача решена.
Если кому понадобится, очень хорошо разжевано тут http://dev.mindillusion.ru/std-sort/
Re: std::map Вопрос по сортировки элементов
От: smeeld  
Дата: 10.03.14 12:11
Оценка:
Здравствуйте, Anton_Savickiy, Вы писали:

Извините, что не в тему, на каком курсе учитесь? Интересно.
Re[2]: std::map Вопрос по сортировки элементов
От: Anton_Savickiy  
Дата: 10.03.14 12:46
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Здравствуйте, Anton_Savickiy, Вы писали:


S>Извините, что не в тему, на каком курсе учитесь? Интересно.


Я еще на курсах только... Все так плохо?
Re[3]: std::map Вопрос по сортировки элементов
От: MasterZiv СССР  
Дата: 11.03.14 09:01
Оценка:
On 10.03.2014 14:32, Anton_Savickiy wrote:

> Я согласен с тоном Вашего ответа, попробую еще раз.

>
> #define NUM 100000
>
> int A[NUM];
> for(int i=0;i<NUM;i++) A[i]=(int)rand();
>
> vector<int> v(A,A+NUM);
> sort(v.begin(),v.end());
>
> Вот так мне понятно, т е в случае вектора, а если вместо вектора будет
> массив структур и мне нужно отсортировать по определенному элементу?
> Как накормить STL?


sort( A, A+NUM );
Posted via RSDN NNTP Server 2.1 beta
Re[4]: std::map Вопрос по сортировки элементов
От: Anton_Savickiy  
Дата: 12.03.14 07:23
Оценка:
Здравствуйте, 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

Конечно можно усреднить и посмотреть детальнее, но тенденция понятна.

Существуют ли какие-нибудь методы оптимизации? Или это плата за абстракцию?
Спасибо.
Re[6]: std::map Вопрос по сортировки элементов
От: Anton_Savickiy  
Дата: 12.03.14 07:47
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Здравствуйте, Anton_Savickiy, Вы писали:


A_S>>2) А теперь отсортируем структуры.


A_S>>a) STL

A_S>>

A_S>>struct sort_rule
A_S>>{
A_S>>    bool operator() (DATA_C i, DATA_C j)               // <-- Замени передачу по значению на ссылки
SVZ>        bool operator() (const DATA_C& i, const DATA_C& j) const  // <-- Вот так
SVZ>        {
SVZ>             return (CompareFileTime(&i.ft,&j.ft) < 0);
SVZ>        }
A_S>>} sort_object;

A_S>>



A_S>>А вот тут уже результат совсем другой. Да, сортируются всегда одинаковые массивы.


A_S>>STL time = 1209ms

A_S>>selectSortS time = 911ms

A_S>>Конечно можно усреднить и посмотреть детальнее, но тенденция понятна.


A_S>>Существуют ли какие-нибудь методы оптимизации? Или это плата за абстракцию?

SVZ>Просто неправильно готовишь.

Совсем другое дело, спасибо Станислав.

STL time = 498ms
selectSortS time = 904ms
Re[5]: std::map Вопрос по сортировки элементов
От: Stanislav V. Zudin Россия  
Дата: 12.03.14 08:08
Оценка:
Здравствуйте, Anton_Savickiy, Вы писали:

Не удержусь, еще немного покритикую.

A_S>a) STL

A_S>
A_S>struct DATA
A_S>{
A_S>    int    cmd;
A_S>    float    var;
A_S>};

A_S>struct DATA_C
A_S>{
A_S>    FILETIME    ft;
A_S>    DATA        dt[1000];
A_S>};

A_S>struct sort_rule
A_S>{
A_S>    bool operator() (DATA_C i, DATA_C j)
A_S>    {return (CompareFileTime(&i.ft,&j.ft)==-1) ? true:false;}
A_S>} sort_object;

A_S>DATA_C d[NUM];
A_S>SYSTEMTIME st;
A_S>GetLocalTime(&st);

A_S>for(int i=0;i<NUM;i++)
A_S>{    
A_S>    st.wMilliseconds = (WORD)rand()%1000;
A_S>    SystemTimeToFileTime(&st,&d[i].ft);
A_S>}

A_S>vector<DATA_C> vecObj(d,d+NUM);
A_S>sort(vecObj.begin(), vecObj.end(),sort_object);  // #1
A_S>


#1 — Функтор имеет смысл использовать тогда, когда требуется хранить состояние или какие-то данные для сортировки. Например, упорядочить надо по данным, которых нет внутри DATA_C. Тогда внутри функтора можно хранить указатель на внешние данные. В данном случае можно обойтись функцией сравнения (тупо меньше кода ).

Еще один прием: если элементы коллекции очень "тяжелые" и их копирование может быть накладным, либо требуется сортировка по разным критериям, то стоит сортировать индексы элементов. Заводится отдельный массив, в который складываются индексы от 0 до NUM:

std::vector<int> indexes(NUM);
for(int i = 0;  i < NUM; ++i)   // Можно использовать std::generate
   indexes[i] = i;

class Comparator
{
   public:
     Comparator(const vector<DATA_C>* vecObj) : m_vecObj(vecObj) {}
     bool operator()(int lv, int rv) const
     {
         return CompareFileTime(&(*m_vecObj)[lv].ft, &(*m_vecObj)[rv].ft);
     }
   private:
     const vector<DATA_C>* m_vecObj; // <-- В принципе можно использовать ссылку, а не указатель
};

std::sort(indexes.begin(), indexes.end(), Comparator(&vecObj)); // <-- Можно обойтись временным объектом компаратора

// Обход по упорядоченным элементам:
for(std::vector<int>::const_iterator it = indexes.begin(), itE = indexes.end(); it != itE; ++it)
{
   DoSomething( vecObj[*it]); 
}



A_S>
A_S>void selectSortS(DATA_C* ptr,int size)
A_S>{
A_S>    DATA_C tmp;
A_S>    int idx;
A_S>    for(int i=0;i<size;++i)
A_S>    { 
A_S>        idx = i; 
A_S>    memcpy(&tmp,&ptr[i],sizeof(DATA_C));
A_S>        for(int j=i+1;j<size;++j)
A_S>        {
A_S>        if(CompareFileTime(&ptr[j].ft,&tmp.ft)==-1)
A_S>            {
A_S>               idx = j; 
A_S>               memcpy(&tmp,&ptr[j],sizeof(DATA_C));
A_S>            }
A_S>        }

A_S>        memcpy(&ptr[idx],&ptr[i],sizeof(DATA_C));
A_S>        memcpy(&ptr[i],&tmp,sizeof(DATA_C));
A_S>    }
A_S>}

A_S>


Т.к. это С++, а не С, то нет необходимости возиться с memcpy (за исключением определенных экзотических случаев).
Копировать структуры можно как обычные переменные:

A_S>        memcpy(&ptr[idx],&ptr[i],sizeof(DATA_C));
A_S>        memcpy(&ptr[i],&tmp,sizeof(DATA_C));
    ptr[idx] = ptr[i];
    ptr[i] = tmp;


А если делать совсем правильно, то нет смысла многократно перезаписывать tmp, достаточно сохранять индекс.

void selectSortS(DATA_C* ptr,int size)
{
    int idx;
    for(int i=0;i<size;++i)
    { 
        idx = i; 
        for(int j=i+1;j<size;++j)                            // Для каждого последующего элемента
        {
        if(CompareFileTime(&ptr[j].ft,&ptr[idx].ft) < 0) // Если найден элемент меньше текущего
            {
               idx = j;                                      // Запомнить индекс
            }
        }

        if (i != idx)                                        // Обменять местами
            std::swap(ptr[idx], ptr[i]);
    }
}
_____________________
С уважением,
Stanislav V. Zudin
Re[6]: std::map Вопрос по сортировки элементов
От: Anton_Savickiy  
Дата: 12.03.14 10:13
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Здравствуйте, Anton_Savickiy, Вы писали:


SVZ>Не удержусь, еще немного покритикую.


A_S>>a) STL

A_S>>
A_S>>struct DATA
A_S>>{
A_S>>    int    cmd;
A_S>>    float    var;
A_S>>};

A_S>>struct DATA_C
A_S>>{
A_S>>    FILETIME    ft;
A_S>>    DATA        dt[1000];
A_S>>};

A_S>>struct sort_rule
A_S>>{
A_S>>    bool operator() (DATA_C i, DATA_C j)
A_S>>    {return (CompareFileTime(&i.ft,&j.ft)==-1) ? true:false;}
A_S>>} sort_object;

A_S>>DATA_C d[NUM];
A_S>>SYSTEMTIME st;
A_S>>GetLocalTime(&st);

A_S>>for(int i=0;i<NUM;i++)
A_S>>{    
A_S>>    st.wMilliseconds = (WORD)rand()%1000;
A_S>>    SystemTimeToFileTime(&st,&d[i].ft);
A_S>>}

A_S>>vector<DATA_C> vecObj(d,d+NUM);
A_S>>sort(vecObj.begin(), vecObj.end(),sort_object);  // #1
A_S>>


SVZ>#1 — Функтор имеет смысл использовать тогда, когда требуется хранить состояние или какие-то данные для сортировки. Например, упорядочить надо по данным, которых нет внутри DATA_C. Тогда внутри функтора можно хранить указатель на внешние данные. В данном случае можно обойтись функцией сравнения (тупо меньше кода ).


SVZ>Еще один прием: если элементы коллекции очень "тяжелые" и их копирование может быть накладным, либо требуется сортировка по разным критериям, то стоит сортировать индексы элементов. Заводится отдельный массив, в который складываются индексы от 0 до NUM:


SVZ>
SVZ>std::vector<int> indexes(NUM);
SVZ>for(int i = 0;  i < NUM; ++i)   // Можно использовать std::generate
SVZ>   indexes[i] = i;

SVZ>class Comparator
SVZ>{
SVZ>   public:
SVZ>     Comparator(const vector<DATA_C>* vecObj) : m_vecObj(vecObj) {}
SVZ>     bool operator()(int lv, int rv) const
SVZ>     {
SVZ>         return CompareFileTime(&(*m_vecObj)[lv].ft, &(*m_vecObj)[rv].ft);
SVZ>     }
SVZ>   private:
SVZ>     const vector<DATA_C>* m_vecObj; // <-- В принципе можно использовать ссылку, а не указатель
SVZ>};

SVZ>std::sort(indexes.begin(), indexes.end(), Comparator(&vecObj)); // <-- Можно обойтись временным объектом компаратора

SVZ>// Обход по упорядоченным элементам:
SVZ>for(std::vector<int>::const_iterator it = indexes.begin(), itE = indexes.end(); it != itE; ++it)
SVZ>{
SVZ>   DoSomething( vecObj[*it]); 
SVZ>}
SVZ>



A_S>>
A_S>>void selectSortS(DATA_C* ptr,int size)
A_S>>{
A_S>>    DATA_C tmp;
A_S>>    int idx;
A_S>>    for(int i=0;i<size;++i)
A_S>>    { 
A_S>>        idx = i; 
A_S>>    memcpy(&tmp,&ptr[i],sizeof(DATA_C));
A_S>>        for(int j=i+1;j<size;++j)
A_S>>        {
A_S>>        if(CompareFileTime(&ptr[j].ft,&tmp.ft)==-1)
A_S>>            {
A_S>>               idx = j; 
A_S>>               memcpy(&tmp,&ptr[j],sizeof(DATA_C));
A_S>>            }
A_S>>        }

A_S>>        memcpy(&ptr[idx],&ptr[i],sizeof(DATA_C));
A_S>>        memcpy(&ptr[i],&tmp,sizeof(DATA_C));
A_S>>    }
A_S>>}

A_S>>


SVZ>Т.к. это С++, а не С, то нет необходимости возиться с memcpy (за исключением определенных экзотических случаев).

SVZ>Копировать структуры можно как обычные переменные:

SVZ>
A_S>>        memcpy(&ptr[idx],&ptr[i],sizeof(DATA_C));
A_S>>        memcpy(&ptr[i],&tmp,sizeof(DATA_C));
SVZ>    ptr[idx] = ptr[i];
SVZ>    ptr[i] = tmp;
SVZ>


SVZ>А если делать совсем правильно, то нет смысла многократно перезаписывать tmp, достаточно сохранять индекс.


SVZ>
SVZ>void selectSortS(DATA_C* ptr,int size)
SVZ>{
SVZ>    int idx;
SVZ>    for(int i=0;i<size;++i)
SVZ>    { 
SVZ>        idx = i; 
SVZ>        for(int j=i+1;j<size;++j)                            // Для каждого последующего элемента
SVZ>        {
SVZ>        if(CompareFileTime(&ptr[j].ft,&ptr[idx].ft) < 0) // Если найден элемент меньше текущего
SVZ>            {
SVZ>               idx = j;                                      // Запомнить индекс
SVZ>            }
SVZ>        }

SVZ>        if (i != idx)                                        // Обменять местами
SVZ>            std::swap(ptr[idx], ptr[i]);
SVZ>    }
SVZ>}

SVZ>


Спасибо Станислав за критику и рекомендации.
Забавный пример с очень "тяжелыми" данными, но его нужно обмозговать, с ходу как то не очень.
Ваша оптимизация selectSortS дала еще 200мс выигрыша.
Re[7]: std::map Вопрос по сортировки элементов
От: Аноним  
Дата: 12.03.14 11:24
Оценка:
Здравствуйте, Anton_Savickiy, Вы писали:

A_S>Спасибо Станислав за критику и рекомендации.

A_S>Забавный пример с очень "тяжелыми" данными, но его нужно обмозговать, с ходу как то не очень.
A_S>Ваша оптимизация selectSortS дала еще 200мс выигрыша.
А еще есть различные инструменты для программистов. В частности, одни их них профилировщиками называются. Их используют, чтобы найти узкие места в программе и оптимизировать код.
Re[8]: std::map Вопрос по сортировки элементов
От: Anton_Savickiy  
Дата: 12.03.14 18:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Anton_Savickiy, Вы писали:


A_S>>Спасибо Станислав за критику и рекомендации.

A_S>>Забавный пример с очень "тяжелыми" данными, но его нужно обмозговать, с ходу как то не очень.
A_S>>Ваша оптимизация selectSortS дала еще 200мс выигрыша.
А>А еще есть различные инструменты для программистов. В частности, одни их них профилировщиками называются. Их используют, чтобы найти узкие места в программе и оптимизировать код.

А можете навскидку озвучить что-нибудь?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.