сортировка
От: DivnenkoIvan Россия  
Дата: 27.06.07 10:14
Оценка:
Привет,

наверняка есть решение с помощтю STL такой задачи: есть структура


struct Data
{
  int a;
  LPCTSTR str;
};


и есть вектор std::vector<Data> v;

нужно сделать сортировку по полю str, при условии что сравнение должна выполнять некоторая моя специализированная функция.

как реализовать?
Re: сортировка
От: Анатолий Широков СССР  
Дата: 27.06.07 10:29
Оценка: 2 (1) :)
DI>нужно сделать сортировку по полю str, при условии что сравнение должна выполнять некоторая моя специализированная функция.

DI>как реализовать?



struct my_less
{
   bool operator()(Data const &a, Data const &b) const {
       return strcmp(a.str, b.str) < 0;
   }
};

std::vector<Data> v;
...
std::sort(v.begin(), v.end(), my_less());
Re: сортировка
От: l33thaxor  
Дата: 27.06.07 10:33
Оценка:
Здравствуйте, DivnenkoIvan, Вы писали:

DI>Привет,


DI>наверняка есть решение с помощтю STL такой задачи: есть структура



DI>
DI>struct Data
DI>{
DI>  int a;
DI>  LPCTSTR str;
DI>};
DI>


DI>и есть вектор std::vector<Data> v;


DI>нужно сделать сортировку по полю str, при условии что сравнение должна выполнять некоторая моя специализированная функция.


DI>как реализовать?


struct my_less {
    bool operator()(Data const & lhs, Data const & rhs) {
        return strcmp(lhs.str, rhs.str) < 0;
    }
};

std::sort(v.begin(), v.end(), my_less());
Re: сортировка
От: valker  
Дата: 27.06.07 10:48
Оценка:
Здравствуйте, DivnenkoIvan, Вы писали:

DI>Привет,


DI>наверняка есть решение с помощтю STL такой задачи: есть структура



DI>
DI>struct Data
DI>{
DI>  int a;
DI>  LPCTSTR str;
DI>};
DI>


DI>и есть вектор std::vector<Data> v;


DI>нужно сделать сортировку по полю str, при условии что сравнение должна выполнять некоторая моя специализированная функция.


DI>как реализовать?


#include "stdafx.h"
#include <vector>
#include <algorithm>
#include <functional>
#include <windows.h>

struct Data
{
    int a;
    LPCTSTR str;
};

bool special_sort_function(const Data& left, const Data& right) {
    return lstrcmp(left.str, right.str) < 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<Data> v;
    Data data;
    data.str = _T("alfa");  v.push_back(data);
    data.str = _T("omega"); v.push_back(data);
    data.str = _T("123");   v.push_back(data);
    std::sort(v.begin(), v.end(), std::ptr_fun(special_sort_function));
    return 0;
}
Re: сортировка
От: Кодт Россия  
Дата: 27.06.07 11:04
Оценка:
Здравствуйте, DivnenkoIvan, Вы писали:

DI>наверняка есть решение с помощтю STL такой задачи: есть структура

DI>struct Data
DI>{
DI>  int a;
DI>  LPCTSTR str;
DI>};

Так, сразу на всякий случай оффтопик: а строки-то ты где хранишь? На которые у тебя указатели в этой структуре.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: сортировка
От: DivnenkoIvan Россия  
Дата: 27.06.07 12:20
Оценка:
Здравствуйте, Кодт, Вы писали:

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


DI>>наверняка есть решение с помощтю STL такой задачи: есть структура

К>
DI>>struct Data
DI>>{
DI>>  int a;
DI>>  LPCTSTR str;
DI>>};
К>

К>Так, сразу на всякий случай оффтопик: а строки-то ты где хранишь? На которые у тебя указатели в этой структуре.

для строк выделяется память, попробовал первый предложенный варинт — все работает. но вот


struct NodeSorterParents
{
    bool operator()(Data *a, Data *b) const 
    {
        здесь сравнение
    }
};

std::vector<Data *> v;

sort(v.begin(), v.end(), NodeSort());


вылетает — а почему? память при push_back в v для Data выделяется 100%.
Re[3]: сортировка
От: valker  
Дата: 27.06.07 12:43
Оценка:
Здравствуйте, DivnenkoIvan, Вы писали:

DI>Здравствуйте, Кодт, Вы писали:


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


DI>>>наверняка есть решение с помощтю STL такой задачи: есть структура

К>>
DI>>>struct Data
DI>>>{
DI>>>  int a;
DI>>>  LPCTSTR str;
DI>>>};
К>>

К>>Так, сразу на всякий случай оффтопик: а строки-то ты где хранишь? На которые у тебя указатели в этой структуре.

DI>для строк выделяется память, попробовал первый предложенный варинт — все работает. но вот



DI>
DI>struct NodeSorterParents
DI>{
DI>    bool operator()(Data *a, Data *b) const 
DI>    {
DI>        здесь сравнение
DI>    }
DI>};

DI>std::vector<Data *> v;

DI>sort(v.begin(), v.end(), NodeSort());
DI>


DI>вылетает — а почему? память при push_back в v для Data выделяется 100%.


Вылетает при пустом векторе?
А если так:
struct Data
{
    int a;
    LPCTSTR str;
};

bool special_sort_function(Data* left, Data* right) {
    return lstrcmp(left->str, right->str) < 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<Data*> v;
    v.push_back(new Data());    v.back()->str=_T("alfa");
    v.push_back(new Data());    v.back()->str=_T("omega");
    v.push_back(new Data());    v.back()->str=_T("123");
    std::sort(v.begin(), v.end(), std::ptr_fun(special_sort_function));
    return 0;
}

По-моему, тут только утечка памяти, от этого не должно "вылетать".
Re[4]: сортировка
От: DivnenkoIvan Россия  
Дата: 27.06.07 12:47
Оценка:
Здравствуйте, valker, Вы писали:

V>Вылетает при пустом векторе?

V>А если так:
V>
V>struct Data
V>{
V>    int a;
V>    LPCTSTR str;
V>};

V>bool special_sort_function(Data* left, Data* right) {
V>    return lstrcmp(left->str, right->str) < 0;
V>}

V>int _tmain(int argc, _TCHAR* argv[])
V>{
V>    std::vector<Data*> v;
V>    v.push_back(new Data());    v.back()->str=_T("alfa");
V>    v.push_back(new Data());    v.back()->str=_T("omega");
V>    v.push_back(new Data());    v.back()->str=_T("123");
V>    std::sort(v.begin(), v.end(), std::ptr_fun(special_sort_function));
V>    return 0;
V>}
V>

V>По-моему, тут только утечка памяти, от этого не должно "вылетать".

вылетает как раз наоборот — при наличие элементов: вылетает и при таком коде:



struct STreeKnwNode
{
    int                id, parent;
};

struct NodeSorterParents
{
    bool operator()(STreeKnwNode const &a, STreeKnwNode const &b) const 
    {
        return (a.parent == b.parent);
    }
};

...
std::vector<STreeKnwNode> m_arNodes;

... тут m_arNodes заполняется структурами STreeKnwNode

sort(m_arNodes.begin(), m_arNodes.end(), NodeSorterParents()); // тут и вылетает
...
Re[5]: сортировка
От: DivnenkoIvan Россия  
Дата: 27.06.07 12:49
Оценка:
вылетает кстати с азертом и сообщением "invalid operator<"
Re[5]: сортировка
От: valker  
Дата: 27.06.07 12:51
Оценка: 2 (1)
Здравствуйте, DivnenkoIvan, Вы писали:

DI>
DI>struct NodeSorterParents
DI>{
DI>    bool operator()(STreeKnwNode const &a, STreeKnwNode const &b) const 
DI>    {
DI>        return (a.parent < b.parent);
DI>    }
DI>};
DI>


Знак "меньше" нужно использовать, а не "равенство".
Re[6]: сортировка
От: DivnenkoIvan Россия  
Дата: 27.06.07 12:59
Оценка:
Здравствуйте, valker, Вы писали:

V>Знак "меньше" нужно использовать, а не "равенство".


получилось — а почему нельзя == использовать? книжки нет под рукой просто
Re[7]: сортировка
От: valker  
Дата: 27.06.07 13:02
Оценка:
Здравствуйте, DivnenkoIvan, Вы писали:

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


V>>Знак "меньше" нужно использовать, а не "равенство".


DI> получилось — а почему нельзя == использовать? книжки нет под рукой просто


Ты задаешь желаемый порядок следования элементов. этот элемент больше — его в конец, этот меньше — его в начало. а имея оператор эквивалентности ты порядок не определишь.
Re[6]: сортировка
От: Кодт Россия  
Дата: 27.06.07 13:13
Оценка:
Здравствуйте, DivnenkoIvan, Вы писали:

DI>вылетает кстати с азертом и сообщением "invalid operator<"


И немудрено: твой предикат выполняет проверку на равенство, а должен — на упорядоченность.
Следует ли он аксиоматике строгого порядка или нет — элементарно проверяется:
— !p(x,x) — антирефлексивность
— p(x,y) => !p(y,x) — антисимметричность
— p(x,y) & p(y,z) => p(x,z) — транзитивность
Отладочная версия STL эту проверку сделала.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[8]: сортировка
От: DivnenkoIvan Россия  
Дата: 27.06.07 16:18
Оценка:
Здравствуйте, valker, Вы писали:

на блог то решение вывесили а даже оценки не дали
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.