смешанная сортировка списка
От: Аноним  
Дата: 24.09.07 16:31
Оценка:
есть список, в котором хранятся стринги
x_1 x_2, x_3.... понятно да? и так до х_99

попадают они туда как попало, сперва может х_50 прийти, потом х_2.
Внимание вопрос: как (чем) отсортировать такой список, чтоб там все по порядку шло
х_1, х_2 ... х_9, х_10, х_11 .... х_19, х_20 ну и т.д. понятно да?

Собственно прошу помощи....

То, что это string и list — это неизменяемо.
Спасибо....
Re: смешанная сортировка списка
От: Roman Odaisky Украина  
Дата: 24.09.07 17:19
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>есть список, в котором хранятся стринги

А>x_1 x_2, x_3.... понятно да? и так до х_99

А>попадают они туда как попало, сперва может х_50 прийти, потом х_2.

А>Внимание вопрос: как (чем) отсортировать такой список, чтоб там все по порядку шло
А>х_1, х_2 ... х_9, х_10, х_11 .... х_19, х_20 ну и т.д. понятно да?

Так всегда одно и то же получаться будет, { "x_1", "x_2", ..., "x_99" }?
До последнего не верил в пирамиду Лебедева.
Re: смешанная сортировка списка
От: Аноним  
Дата: 24.09.07 17:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>есть список, в котором хранятся стринги

А>x_1 x_2, x_3.... понятно да? и так до х_99

А>попадают они туда как попало, сперва может х_50 прийти, потом х_2.

А>Внимание вопрос: как (чем) отсортировать такой список, чтоб там все по порядку шло
А>х_1, х_2 ... х_9, х_10, х_11 .... х_19, х_20 ну и т.д. понятно да?

А>Собственно прошу помощи....


А>То, что это string и list — это неизменяемо.

А>Спасибо....

У листа есть sort, но лучше все же map использовать
Re: смешанная сортировка списка
От: Sashaka Россия  
Дата: 24.09.07 17:29
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>есть список, в котором хранятся стринги

А>x_1 x_2, x_3.... понятно да? и так до х_99

А>попадают они туда как попало, сперва может х_50 прийти, потом х_2.

А>Внимание вопрос: как (чем) отсортировать такой список, чтоб там все по порядку шло
А>х_1, х_2 ... х_9, х_10, х_11 .... х_19, х_20 ну и т.д. понятно да?

А>Собственно прошу помощи....


А>То, что это string и list — это неизменяемо.

А>Спасибо....

добавлять через insert + upper_bound/lower_bound

смотреть здесь
Re: смешанная сортировка списка
От: _Dreamer Россия  
Дата: 25.09.07 00:33
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>есть список, в котором хранятся стринги

А>x_1 x_2, x_3.... понятно да? и так до х_99

А>попадают они туда как попало, сперва может х_50 прийти, потом х_2.

А>Внимание вопрос: как (чем) отсортировать такой список, чтоб там все по порядку шло
А>х_1, х_2 ... х_9, х_10, х_11 .... х_19, х_20 ну и т.д. понятно да?

А>Собственно прошу помощи....


А>То, что это string и list — это неизменяемо.

А>Спасибо....

Если оптимизированный вариант Roman Odaisky не подходит, можно так
template < class T >
struct x_sorter : std::binary_function<std::string, std::string, bool>
{
    T func_;

    explicit x_sorter( T func ) : func_(func) {}

    bool operator () ( const std::string& o1, const std::string& o2 ) const
    {
        // просто без проверок будем считать, что все строки имею вид "x_N"
        const char * p1 = o1.c_str() + 2, * p2 = o2.c_str() + 2;
        return this->func_( strtol( p1, NULL, 10 ), strtol( p2, NULL, 10 ) );
    }
};

template < class T >
x_sorter< T > make_sorter( T t ) 
{
    return x_sorter<T>( t );
}

void list_sort()
{
    std::list<std::string> lst;
    lst.push_back( "x_50" );
    lst.push_back( "x_10" );
    lst.push_back( "x_20" );

    lst.sort( make_sorter( std::less<int>() ) );
}
Re: смешанная сортировка списка
От: Аноним  
Дата: 25.09.07 06:38
Оценка: :)
Тока что выяяснил еще кое-что:
то, что "от х_1 до х_99 там хранятся значения стрингов"
не значит что там всегда _все_ значения хранятся.
Не значит, что именно только в одной форме х_N
Т.о. процедуру сортировки мне нужно в общей форме и простую.
Ибо шаблоны еще добавлять мне нет возможности. Тока cxx файл
у меня в доступе.
И вроде бы какая-то фича в stl делает такое по умолчанию.
Не помните кто именно?
Re[2]: смешанная сортировка списка
От: Sashaka Россия  
Дата: 25.09.07 07:25
Оценка:
Здравствуйте, Аноним, Вы писали:

А>И вроде бы какая-то фича в stl делает такое по умолчанию.

А>Не помните кто именно?

set/map
Re[3]: смешанная сортировка списка
От: Аноним  
Дата: 25.09.07 07:33
Оценка:
Здравствуйте, Sashaka, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


А>>И вроде бы какая-то фича в stl делает такое по умолчанию.

А>>Не помните кто именно?

S>set/map



увы, нет. они используют lessThan метод. который опять таки гарантирует, что
после х_1 будет х_10....
Re: смешанная сортировка списка
От: Кодт Россия  
Дата: 25.09.07 08:05
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>есть список, в котором хранятся стринги

А>x_1 x_2, x_3.... понятно да? и так до х_99

Проще всего завести массив булевых флажков (или, если строки повторяются, — массив счётчиков).
И сделать парсер/генератор строк (элементарно, на sscanf/sprintf).
unsigned int xstr_to_int(const char* str)
{
    unsigned int n;
    if( sscanf(str, "x_%u", &n) != 1 )
        assert(false); // подставь сюда любой механизм паники
    return n;
}

string int_to_xstr(unsigned int n)
{
    char buf[32];
    sprintf(buf, "x_%u", n);
    return buf;
}

.....

vector<unsigned int> dataset(100, 0);
.....
while( не надоест )
{
    unsigned int n = xstr_to_int( get_next_string() );
    if(1<=n && n<=99)
        ++dataset[n];
    else
        assert(false);
}
.....
for(unsigned int n = 1; n != 99; ++n)
{
    unsigned int count = dataset[n];
    if(count != 0)
    {
        string s = int_to_xstr(n);
        for(int k=0; k!=count; ++k)
            put_string( s );
    }
}
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: смешанная сортировка списка
От: Аноним  
Дата: 25.09.07 10:25
Оценка:
Здравствуйте, Кодт, Вы писали:

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


А>>есть список, в котором хранятся стринги

А>>x_1 x_2, x_3.... понятно да? и так до х_99

К>Проще всего завести массив булевых флажков (или, если строки повторяются, — массив счётчиков).

К>И сделать парсер/генератор строк (элементарно, на sscanf/sprintf).
К>
.......
К>


Великолепное потенциальное решение для моей другой проблемы....

Но для этой — мне нужна только сортровка! У меня не полные исходники библиотеки.
есть тока сам список, на выходе из ф-ии полученный.
Вот осталось его отсортировать...
Re[3]: смешанная сортировка списка
От: Кодт Россия  
Дата: 25.09.07 10:50
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Великолепное потенциальное решение для моей другой проблемы....


А>Но для этой — мне нужна только сортровка! У меня не полные исходники библиотеки.

А>есть тока сам список, на выходе из ф-ии полученный.
А>Вот осталось его отсортировать...

Сортировка подсчётом — быстро и дёшево.
Честная сортировка списка строк — дороже встанет.

К тому же, вопрос: как правильно (как тебе нужно)
— "x_1" < "x_10" < ... < "x_19" < "x_2" < ...
или
— "x_1" < "x_2" < ... < "x_9" < "x_10" < ...
В последнем случае придётся писать собственную функцию сравнения, которая всё равно распарсит каждую строку.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[4]: смешанная сортировка списка
От: Кодт Россия  
Дата: 25.09.07 10:50
Оценка:
Здравствуйте, <Аноним>, Вы писали:

S>>set/map


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

А>после х_1 будет х_10....

Нет такого метода lessThan.
Есть предикат std::less, который использует (по умолчанию) оператор <.
Но никто не мешает сделать set/map с произвольным предикатом, удовлетворяющим аксиоматике порядка. Тем же самым, каким ты собрался сортировать список.

Кстати, если у тебя VC6, то знай: list.sort содержит баг, из-за которого сортирует исключительно по <, невзирая на предикаты.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[4]: смешанная сортировка списка
От: Аноним  
Дата: 25.09.07 12:02
Оценка:
Здравствуйте, Кодт, Вы писали:

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


А>>Великолепное потенциальное решение для моей другой проблемы....


А>>Но для этой — мне нужна только сортровка! У меня не полные исходники библиотеки.

А>>есть тока сам список, на выходе из ф-ии полученный.
А>>Вот осталось его отсортировать...

К>Сортировка подсчётом — быстро и дёшево.

К>Честная сортировка списка строк — дороже встанет.

К>К тому же, вопрос: как правильно (как тебе нужно)

К>- "x_1" < "x_10" < ... < "x_19" < "x_2" < ...
К>или
К>- "x_1" < "x_2" < ... < "x_9" < "x_10" < ...
К>В последнем случае придётся писать собственную функцию сравнения, которая всё равно распарсит каждую строку.

У меня второй вариант. "x_1" < "x_2" < ... < "x_9" < "x_10" <
В итоге так и сделал. Спасибо за всё!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.