Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

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

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

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

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

15
zss
Модератор
Эксперт С++
6536 / 6098 / 2008
Регистрация: 18.12.2011
Сообщений: 15,864
Завершенные тесты: 1
27.06.2014, 19:51 #2
1 способ.При перестановки элементов основного массива переставляйте элементы второго и третьего.
2 способ.Заведите дополнительный массив, в который записывайте номер элемента,
который оказался на переставленном месте. Т.е. в начале в нем числа 0,1,2....,
если меняете 1 со 2 получаете 0,2,1,3... и т.д. Тогда после сортировки будет известно,
какой элемент поставить на какое место.
1
gromo
371 / 270 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
27.06.2014, 20:02  [ТС] #3
zss, спасибо, но это с заморочками то есть нужно свой алгоритм сортировки писать, мне бы вот средствами STL
0
0x10
2479 / 1654 / 248
Регистрация: 24.11.2012
Сообщений: 4,097
27.06.2014, 20:05 #4
gromo, тупой и не очень эффективный способ - свалить все векторы в один вектор структур из трех полей, отсортировать по первому полю, результат обратно распределить по векторам.
0
gromo
371 / 270 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
27.06.2014, 20:10  [ТС] #5
0x10, а можно подробнее, что-то не пойму, вектор каких структур?
0
0x10
2479 / 1654 / 248
Регистрация: 24.11.2012
Сообщений: 4,097
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
1
gromo
371 / 270 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
27.06.2014, 20:36  [ТС] #7
0x10, Ого, вот это я понимаю жесткий способ отсортировать
В моем случае вектор будет от силы на 20 элементов, может для такого и правда дешевле будет написать/содрать какую-нибудь примитивную сортировку и просто проранжировать одновременно 3 массива, как сказал zss ?

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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