Форум программистов, компьютерный форум CyberForum.ru

Отсортировать одномерный массив по одной из координат - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Создать класс “Квартира”, состоящей из класса ”Жильцы” http://www.cyberforum.ru/cpp-beginners/thread1094766.html
Создать класс “Квартира”, состоящей из класса ”Жильцы”. Класс “Квартира”: улица, номер, телефон. Класс “Жильцы”: Фамилия, год рождения, пол. Вывести всех пенсионеров и их местожительство.
C++ CLI и GUI приложение - в чем разница? Доброго времени суток. Недавно задался таким вопросом - в чём разница между типами проектов "Консольное приложение" и "Приложение Win32" в Visual Studio (да и не только в VS, различные типы замечал в других редакторах)? Почему в первом случае создаётся окно консоли, а вот втором - нет? И тогда сразу вдогонку - что такое cout? Почему этот объект работает именно с консолью (в консольном приложении)... http://www.cyberforum.ru/cpp-beginners/thread1094753.html
Написать функцию, определяющую среднюю месячную заработную плату рабочего C++
кому не сложно сделайте задачу не успеваю немного Написать функцию, определяющую среднюю месячную заработную плату рабочего, если известно его заработная плата за каждый месяц. Необходимые функции: • ввод данных; • вывод массива данных; • проверка правильности введенных данных; • вычисления суммы заработной платы; • вычисления среднего значения заработной платы;
Ошибка pow: DOMAIN error C++
При запуске в C++ Builder функция спамит вышеуказанной ошибкой, в выводе все значения при (i-j)<0 забиты значением INF, при (i-j)>0 выводятся числа, но весьма далёкие от верных результатов. Пробовал обойти через ab=eln(a)*b и через a-b=1/ab, но результаты выдаёт схожие. Подскажите нубу, в чём может быть проблема. void Matrix (TMatr a) { int i,j; for (i=0;i<n;i++) for (j=0;j<n;j++) ...
C++ Как пропарсить строку типа "43/12" http://www.cyberforum.ru/cpp-beginners/thread1094727.html
как пропарсить строку типа "43/12", причем 43 и 12 интовые поля, а / - charовское.
C++ Создать класс “Квартира”, состоящей из класса ”Жильцы” Создать класс “Квартира”, состоящей из класса ”Жильцы”. Класс “Квартира”: улица, номер, телефон. Класс “Жильцы”: Фамилия, год рождения, пол. Вывести всех пенсионеров и их местожительство. подробнее

Показать сообщение отдельно
Vladimir_R
0 / 0 / 0
Регистрация: 12.02.2014
Сообщений: 1
12.02.2014, 17:08     Отсортировать одномерный массив по одной из координат
Такая задача.
Есть класс, в котором определена матрица 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, с заданным параметром сортировки (по какому значению сортировать). и реализовать её надо полностью как метод класса.

Вот что сейчас получилось:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
template <typename Tfloat>
class particle_beem
{
    public:
        vector <Tfloat> arr;
 
        particle_beem(int dim, int count_el);
        ~particle_beem();
 
        int resize(int count_el);
        int set_dim(int dim);
        int data_create_rand(Tfloat dXmin, Tfloat dXmax, Tfloat dVmin, Tfloat dVmax);
        int data_write_to_file(const char *cFile_name);
        int data_read_from_file(const char *cFile_name);
        int data_sort_by_coordinate(/*тут необходимо передавать как параметр, по какому элементу сортировать*/);
 
    protected:
 
    private:
        int dimension;
        int count_eliments;
 
        static int sort_func(const void *a, const void *b)
        {
            Tfloat* a1=(Tfloat*) a;
            Tfloat* b1=(Tfloat*) b;
 
            //cout<<"sort:"<<a1[2]<<"   "<<b1[2]<<endl;
            return a1[1] - b1[1];  //1 - это по какому элементу идет сортировка, т.е. по второму
        }
 
};
 
//....всякий код....
 
template <typename Tfloat>
int particle_beem<Tfloat>::data_sort_by_coordinate()
{
    qsort(&arr[0], count_eliments, sizeof(Tfloat)*dimension*2, sort_func);
    return 0;
}
На данный момент этот код работает, но мне необходимо передавать как параметр по какому элементу производить сортировку, и сообщать каким то образом этот параметр компаратору sort_func.

через промежуточное прайват свойство класса не получится, т.к. компаратор является статическим членом класса.
Не статическим членом класса его делать не получается, а выносить из класса его не следует по условиям задачи.
Попробовал реализовать qsort функтором, чтобы передавать параметр сортировки через свойство функтора, но qsort функторы (оно и понятно:-)) совсем не ест.
Подскажите пожалуйста уважаемые форумчани, как мне быть в этой ситуации? как все таки передавать этот параметр сортировки.

И еще. На самом деле, в контексте C++ я с большей радостью, как это и положено использовал бы для сортировки std::sort, и заодно тем самым решил бы проблему с параметром и увеличил производительность. Но я не могу придумать как применить std::sort применительно к данной задачи не распихивая строки матрицы по отдельным контейнерам.
Ведь у меня матрица представлена одномерным массивом.
В qsort я меняю местами блоки памяти заданной длинны, например sizeof(Tfloat)*dimension*2.
а в std::sort мне не указать какими блоками памяти мне оперировать, он сортирует не блоки памяти а элементы массива.
Может подскажите как мне применить std::sort к данной задачи?

Заранее всех благодарю!

Добавлено через 14 часов 13 минут
Поставлю вопрос по другому: как передать в компаратору дополнительный параметр?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 06:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru