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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
#1

Есть лёгкий способ отсортировать? - C++

27.06.2014, 19:42. Просмотров 473. Ответов 15
Метки нет (Все метки)

Вобщем есть 3 вектора одинаковой размерности. Нужно отсортировать первый вектор, а остальные два точно также, то есть если в первом векторе 5 элемент после сортировки стал вторым, то также должны поступить и остальные два вектора. |
Есть идеи как это сделать без особых заморочек?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2014, 19:42     Есть лёгкий способ отсортировать?
Посмотрите здесь:

Есть ли способ доступа к элементу списка по индексу? - C++
Есть ли способ доступа к элементу списка по индексу?

Есть ли способ просмотреть код библиотечных функций? - C++
Жутко хочется посмотреть, как устроена, скажем, функция gotoxy из conio.h. Но в заголовочном файле бесконечные отсылки к разным файлам и...

Есть ли способ получить доступ к MS Office color picker - C++
Вопрос программера на VBA программерам на С++. Есть ли способ получить доступ к Офисному компоненту Microsoft - Color Picker - Такой...

Есть ли более удобный способ перевода переменную в строку? - C++
Всем привет, начнем: Есть переменная(которая может быть и переменной и строкой): int fps = 150; есть функция void...

Есть ли более правильный и элегантный способ реализации функции? - C++
Доброе время форумчане! bool db::CreateSQLTable() { QSqlQuery a; QString str = "CREATE TABLE "SortFiles" ("id" INTEGER...

Замена двух строк в огромном файле. Есть ли оптимальный способ? - C++
Есть задача, поменять в огромном текстовом файле (несколько Гб) 2 произвольные строки. Написал 2 программы: в основе 1 берем...

Есть ли способ проверить, сколько указателей указывают на определённую область памяти? - C++
Привет народ. Такой вопрос: Есть ли способ проверить, сколько указателей указывают на определённую область памяти? Спасибо.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,181
Завершенные тесты: 1
27.06.2014, 19:51     Есть лёгкий способ отсортировать? #2
1 способ.При перестановки элементов основного массива переставляйте элементы второго и третьего.
2 способ.Заведите дополнительный массив, в который записывайте номер элемента,
который оказался на переставленном месте. Т.е. в начале в нем числа 0,1,2....,
если меняете 1 со 2 получаете 0,2,1,3... и т.д. Тогда после сортировки будет известно,
какой элемент поставить на какое место.
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
27.06.2014, 20:02  [ТС]     Есть лёгкий способ отсортировать? #3
zss, спасибо, но это с заморочками то есть нужно свой алгоритм сортировки писать, мне бы вот средствами STL
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
27.06.2014, 20:05     Есть лёгкий способ отсортировать? #4
gromo, тупой и не очень эффективный способ - свалить все векторы в один вектор структур из трех полей, отсортировать по первому полю, результат обратно распределить по векторам.
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
27.06.2014, 20:10  [ТС]     Есть лёгкий способ отсортировать? #5
0x10, а можно подробнее, что-то не пойму, вектор каких структур?
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
27.06.2014, 20:17     Есть лёгкий способ отсортировать? #6
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
#include <algorithm>
#include <functional>
#include <iostream>
#include <tuple>
#include <vector>
 
int main() {
    std::vector<int> first {5, 4, 3, 2, 1},
        second {1, 2, 3, 4, 5},
        third {6, 7, 8, 9, 10};
        
    typedef std::tuple<int, int, int> Tuple;
    std::vector<Tuple> tuples;
    for (auto i = 0u; i < first.size(); ++i) {
        tuples.push_back(std::make_tuple(first[i], second[i], third[i]));
    }
    
    for (const auto& item : tuples) {
        std::cout << std::get<0>(item) << " "
            << std::get<1>(item) << " "
            << std::get<2>(item) << std::endl;
    }
    std::cout << std::endl;
    
    std::sort(tuples.begin(), tuples.end(),
        [](const Tuple& lhs, const Tuple& rhs) {
            return std::get<0>(lhs) < std::get<0>(rhs); 
        });
        
    for (const auto& item : tuples) {
        std::cout << std::get<0>(item) << " "
            << std::get<1>(item) << " "
            << std::get<2>(item) << std::endl;
    }
    
    return 0;
}
http://ideone.com/MawcFX
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
27.06.2014, 20:36  [ТС]     Есть лёгкий способ отсортировать? #7
0x10, Ого, вот это я понимаю жесткий способ отсортировать
В моем случае вектор будет от силы на 20 элементов, может для такого и правда дешевле будет написать/содрать какую-нибудь примитивную сортировку и просто проранжировать одновременно 3 массива, как сказал zss ?

Да и лучше emplace_back() использовать в 15 строке, не так ли? Но идея оригинальная ничего не скажешь
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
27.06.2014, 20:41     Есть лёгкий способ отсортировать? #8
академическая задачка? баблсорт сделайте, если да.
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
27.06.2014, 20:44  [ТС]     Есть лёгкий способ отсортировать? #9
академическая задачка? баблсорт сделайте, если да.
Нет, не академическая, и как раз поэтому я всё больше склоняюсь к пузырьковой))
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
27.06.2014, 20:45     Есть лёгкий способ отсортировать? #10
Цитата Сообщение от gromo Посмотреть сообщение
Да и лучше emplace_back() использовать в 15 строке, не так ли?
emplace, предварительно еще reserve на это безобразие. Я ж на автомате накатал.
Цитата Сообщение от gromo Посмотреть сообщение
Но идея оригинальная ничего не скажешь
Да то же самое, что zss предлагал вторым способом, только вместо одного массива индексов хранится N массивов копий объектов, что, понятно, затратно по памяти.
Цитата Сообщение от gromo Посмотреть сообщение
В моем случае вектор будет от силы на 20 элементов, может для такого и правда дешевле будет написать/содрать какую-нибудь примитивную сортировку и просто проранжировать одновременно 3 массива
Как удобнее. Мне было бы влом писать свой алгоритм, и успокоился бы на сортировке вектора пар, где первый элемент пары - объект из массива, второй - его индекс в неотсортированном массиве.
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
27.06.2014, 20:47     Есть лёгкий способ отсортировать? #11
а мапу если поюзать?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.06.2014, 20:48     Есть лёгкий способ отсортировать? #12
Цитата Сообщение от gromo Посмотреть сообщение
лёгкий способ отсортировать
От Аллена Карра
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
27.06.2014, 21:13  [ТС]     Есть лёгкий способ отсортировать? #13
Цитата Сообщение от Kukurudza Посмотреть сообщение
а мапу если поюзать?
и каким образом?
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
27.06.2014, 21:17     Есть лёгкий способ отсортировать? #14
ключи - элементы первого массива, значения- пары соответствующих указателей на элементы из 2 и 3 массивов. хотя этот вариант принципиально особо ничем не отличается от выше описанных.

Добавлено через 1 минуту
вообще, если возникла задача соответствия, может архитектура построена немного неправильно?
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
27.06.2014, 21:19  [ТС]     Есть лёгкий способ отсортировать? #15
Цитата Сообщение от Kukurudza Посмотреть сообщение
если возникла задача соответсвия, может немного архитектура построена немного неправильно?
Возможно и так, буду смотерть.
P.s. Всем большое спасибо за помощь
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2014, 06:19     Есть лёгкий способ отсортировать?
Еще ссылки по теме:

Есть ли C++ нативный способ быстро обнулить массив (аналог bzero)? + ещё 2 вопроса - C++
Второй вопрос - если конструктор обнаружил условия, препятствующие созданию объекта, есть ли способ &quot;не создавать&quot; объект и не использовать...

Анализ данных с COM порта. Есть ли способ чтения файла в процессе его изменения? - C++
Здравствуйте форумчане, передо мной стала задача, которую я никак не могу осилить, а именно анализ данных с COM порта. Принимать данные с...

Есть ли способ, зная ссылку на класс, использовать его значения без запроса по ссылке? - C++
скажем есть 2 класса class ItemList { public: ItemList(); int item; int count; Func*func; }

Есть ли способ закончить "cin" и продолжить программу без ввода? - C++
Я пишу встроеный в консоль таймер, и хочу чтобы во время ожидания (таймер работает) можно было ввести string который закончит отсчет с...

Лёгкий вопрос... - C++
Подскажите пожалуйста, как ограничить количество знаков после запятой в С++? Например 7/3=2,333333333333333333333333333333333333 , а мне...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
28.06.2014, 06:19     Есть лёгкий способ отсортировать? #16
Цитата Сообщение от Kukurudza Посмотреть сообщение
хотя этот вариант принципиально особо ничем не отличается
Разница в том, что сам контейнер map - немножко не для сортировки. Красно-черное дерево - самобалансирующаяся структура для поиска. Т.е. варианты типа сложить все элементы, чтобы потом перекинуть в линейную структуру - просто использование не по назначению. А если говорить более формально, то с использованием мапы получаем аллокации на каждый элемент, ребалансировку при вставке. Деревья, конено же, можно использовать для сортировки, но в конкретно данном случае повода не вижу.
Yandex
Объявления
28.06.2014, 06:19     Есть лёгкий способ отсортировать?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru