сортировка множества
От: Socket Ниоткуда http://www.samborsky.com
Дата: 11.10.07 01:52
Оценка:
Привожу усеченный класс CUrlContainer
он содержит в себе множества

typedef set<UrlContainer,SortCriterionByUnique> MySetType;

уникальность соблюдается ч-з процедуру SortCriterionByUnique по полю unique_value.

Подскажите как можно отсортировать элементы множества по полю get_count

понятно что ч-з std::sort, только какую процедуру сравнения нужно указать?


class UrlContainer {
public:
    string main_value;
    unsigned int unique_value;
    unsigned int get_count;

    UrlContainer(){
        main_value.clear();
        unique_value = 0;
        get_count = 0;
    }
};

class SortCriterionByUnique {
public:
    bool operator() (const UrlContainer& u1, const UrlContainer& u2) const {
        return u1.unique_value < u2.unique_value;
    }
};

class CUrlContainer {
public:
    typedef set<UrlContainer,SortCriterionByUnique> MySetType;

    CUrlContainer(){
        m_last_insert_id = 0;
    }

    ~CUrlContainer(){
    }
private:
    MySetType m_set;

}
http://www.samborsky.com — мой блог
Re: сортировка множества
От: jazzer Россия Skype: enerjazzer
Дата: 11.10.07 01:57
Оценка:
Здравствуйте, Socket, Вы писали:

S>Подскажите как можно отсортировать элементы множества по полю get_count

Никак — уникальность в std::sort обеспечивается через сортировку, их нельзя разделить.

Я бы на твоем месте (я не знаю твоей задачи) либо скопировал содержимое множества в вектор и отсортировал его, либо перешел бы на boost::multi_index
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: сортировка множества
От: Socket Ниоткуда http://www.samborsky.com
Дата: 11.10.07 02:10
Оценка:
Здравствуйте, jazzer, Вы писали:

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


S>>Подскажите как можно отсортировать элементы множества по полю get_count

J>Никак — уникальность в std::sort обеспечивается через сортировку, их нельзя разделить.

но ведь можно же указать в качестве 3 параметра процедуру сравнения?
нужно чтото вроде

bool sort_by_get_count(const UrlContainer& u1,const UrlContainer& u2){
return u1.get_count < u2.get_count;
}

std::sort(my_set.begin(),my_set.end(),sort_by_get_count);
http://www.samborsky.com — мой блог
Re[3]: сортировка множества
От: jazzer Россия Skype: enerjazzer
Дата: 11.10.07 02:12
Оценка:
Здравствуйте, Socket, Вы писали:

S>но ведь можно же указать в качестве 3 параметра процедуру сравнения?


S>std::sort(my_set.begin(),my_set.end(),sort_by_get_count);


нельзя — std::sort требует RandomAccessIterator.

Может, опишешь задачу подробнее?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: сортировка множества
От: Socket Ниоткуда http://www.samborsky.com
Дата: 11.10.07 02:19
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Может, опишешь задачу подробнее?


В общем CUrlContainer содержит в себе уникальные строки.
уникальность проверяется ч-з мою процедуру сравнения SortCriterionByUnique
очень часто идет поиск этих строк, вызывая метод find у моего класса

find(const string& s)

ищу, перебирая значения

CUrlContainer::MySetType::iterator pos;
for( pos = m_set.begin(); pos != m_set.end(); ++pos )
...
здесь проверяется регуляркой.
и я сразу если регулярка сработала у UrlContainer увеличиваю счетчик get_count

т.е. я хочу поднять к верху часто вызываемые элементы, например при каждом тысячнов обращении
http://www.samborsky.com — мой блог
Re[5]: сортировка множества
От: jazzer Россия Skype: enerjazzer
Дата: 11.10.07 02:34
Оценка:
Здравствуйте, Socket, Вы писали:

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


J>>Может, опишешь задачу подробнее?


S>В общем CUrlContainer содержит в себе уникальные строки.

S>уникальность проверяется ч-з мою процедуру сравнения SortCriterionByUnique
S>очень часто идет поиск этих строк, вызывая метод find у моего класса

S>find(const string& s)


S>ищу, перебирая значения


S>CUrlContainer::MySetType::iterator pos;

S>for( pos = m_set.begin(); pos != m_set.end(); ++pos )
S>...
S>здесь проверяется регуляркой.
S>и я сразу если регулярка сработала у UrlContainer увеличиваю счетчик get_count

S>т.е. я хочу поднять к верху часто вызываемые элементы, например при каждом тысячнов обращении


Ну, тогда тебе поможет Boost.MultiIndex, с двумя индексами — уникальный по unique_value (по нему ты будешь добавлять) и неуникальный по get_count (по нему ты будет итерироваться при поиске по регекспу).
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.