есть список, в котором хранятся стринги
x_1 x_2, x_3.... понятно да? и так до х_99
попадают они туда как попало, сперва может х_50 прийти, потом х_2.
Внимание вопрос: как (чем) отсортировать такой список, чтоб там все по порядку шло
х_1, х_2 ... х_9, х_10, х_11 .... х_19, х_20 ну и т.д. понятно да?
Собственно прошу помощи....
То, что это string и list — это неизменяемо.
Спасибо....
Здравствуйте, Аноним, Вы писали:
А>есть список, в котором хранятся стринги А>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 использовать
Здравствуйте, Аноним, Вы писали:
А>есть список, в котором хранятся стринги А>x_1 x_2, x_3.... понятно да? и так до х_99
А>попадают они туда как попало, сперва может х_50 прийти, потом х_2. А>Внимание вопрос: как (чем) отсортировать такой список, чтоб там все по порядку шло А>х_1, х_2 ... х_9, х_10, х_11 .... х_19, х_20 ну и т.д. понятно да?
А>Собственно прошу помощи....
А>То, что это string и list — это неизменяемо. А>Спасибо....
Здравствуйте, Аноним, Вы писали:
А>есть список, в котором хранятся стринги А>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 делает такое по умолчанию.
Не помните кто именно?
Здравствуйте, Аноним, Вы писали:
А>И вроде бы какая-то фича в stl делает такое по умолчанию. А>Не помните кто именно?
set/map
Re[3]: смешанная сортировка списка
От:
Аноним
Дата:
25.09.07 07:33
Оценка:
Здравствуйте, Sashaka, Вы писали:
S>Здравствуйте, Аноним, Вы писали:
А>>И вроде бы какая-то фича в stl делает такое по умолчанию. А>>Не помните кто именно?
S>set/map
увы, нет. они используют lessThan метод. который опять таки гарантирует, что
после х_1 будет х_10....
Здравствуйте, <Аноним>, Вы писали:
А>есть список, в котором хранятся стринги А>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). К>
.......
К>
Великолепное потенциальное решение для моей другой проблемы....
Но для этой — мне нужна только сортровка! У меня не полные исходники библиотеки.
есть тока сам список, на выходе из ф-ии полученный.
Вот осталось его отсортировать...
Здравствуйте, <Аноним>, Вы писали:
А>Великолепное потенциальное решение для моей другой проблемы....
А>Но для этой — мне нужна только сортровка! У меня не полные исходники библиотеки. А>есть тока сам список, на выходе из ф-ии полученный. А>Вот осталось его отсортировать...
Сортировка подсчётом — быстро и дёшево.
Честная сортировка списка строк — дороже встанет.
К тому же, вопрос: как правильно (как тебе нужно)
— "x_1" < "x_10" < ... < "x_19" < "x_2" < ...
или
— "x_1" < "x_2" < ... < "x_9" < "x_10" < ...
В последнем случае придётся писать собственную функцию сравнения, которая всё равно распарсит каждую строку.
Здравствуйте, <Аноним>, Вы писали:
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" <
В итоге так и сделал. Спасибо за всё!