![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Vladimir1R |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 12.2.2014 Репутация: нет Всего: нет |
Такая задача.
Есть класс, в котором определена матрица NxM в виде одномерного массива в контейнере vector. в каждой строки матрицы хранится n-мерные координаты некоторого объекта типа x1,x2,x3,xn,v1,v2,v3,vn Требуется отсортировать этот одномерный массив по одной из координат, например по координате x2. Т.е. нужно переставить строки этой матрицы таким образом, чтобы в каждой строке x2 (второй элемент строки) возрастал. Т.е. сверху матрицы были строки с меньшим вторым элементом, а снизу с большим. Приходится обрабатывать огромные массивы данных, поэтому скорость и экономия памяти в данной задаче критична. По этому как инструмент сортировки были выбраны стандартные std:sort либо stdlib qsort. Так же хочу обратить внимание на то что данная матрица представлена в виде ОДНОмерного массива и досуп к n-му элементу m-ой строки в матрице NxM осуществляется как не A[m][n], а вот так A[m*N+n]. Это сделано в целях упрощения задачи и экономии памяти. Итак, требуется реализовать сортировку матрицы с помощью либо std::sort, либо stdlib qsort, с заданным параметром сортировки (по какому значению сортировать). и реализовать её надо полностью как метод класса. Вот что сейчас получилось:
На данный момент этот код работает, но мне необходимо передавать как параметр по какому элементу производить сортировку, и сообщать каким то образом этот параметр компаратору sort_func. через промежуточное прайват свойство класса не получится, т.к. компаратор является статическим членом класса. Не статическим членом класса его делать не получается, а выносить из класса его не следует по условиям задачи. Попробовал реализовать компаратор sort_func функтором, чтобы передавать параметр сортировки через свойство функтора, но qsort функторы (оно и понятно:-)) совсем не ест. Подскажите пожалуйста уважаемые форумчани, как мне быть в этой ситуации? как все таки передавать этот параметр сортировки. И еще. На самом деле, в контексте C++ я с большей радостью, как это и положено использовал бы для сортировки std::sort, и заодно тем самым решил бы проблему с параметром и увеличил производительность. Но я не могу придумать как применить std::sort применительно к данной задачи не распихивая строки матрицы по отдельным контейнерам. Ведь у меня матрица представлена одномерным массивом. В qsort я меняю местами блоки памяти заданной длинны, например sizeof(Tfloat)*dimension*2. а в std::sort мне не указать какими блоками памяти мне оперировать, он сортирует не блоки памяти а элементы массива. Может подскажите как мне применить std::sort к данной задачи? Заранее всех благодарю! |
|||
|
||||
| borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Т.к. тебе нужно переставлять местами строки, а в лучшем случае это придётся делать n * log( n ) раз, то предлагаю след. алгоритм:
1) Создать структуру типа такой
2) Выделить ещё один вектор для таких структур.
3) Перед сортировкой заполнить этот вектор из соотв. столбца (как-то так):
4) Сортировать этот массив std::sort'ом 5) расставить строки в массиве arr в соответствии с их номерами из forSort[ i ].rowIdx. Как это сделать - пока не знаю, но, думаю, ты и сам справишься )) -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |