Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/35: Рейтинг темы: голосов - 35, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 23.11.2010
Сообщений: 136

Перенести элементы из одного вектора в другой

21.06.2019, 19:10. Показов 7572. Ответов 47

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
    
 
    std:: vector< std::tuple<int, int,int> > passengers; // Все пассажиры: ID, отправление, назначение
std:: vector< std::tuple<int, int,int> > active_users; // те, которые смогут поехать, которым по пути с движением лифта. ОНи будут перенесены из passengers, а там соответственно удалены.
 
for (auto k = passengers.begin(); k != passengers.end(); )
    {
        int userid = std::get<0>(*k);
        int cur_fl_queue = std::get<1>(*k);
        int dst_queue = std::get<2>(*k);
        if (cur_fl_queue > dst_queue) d1 = DOWN; // выбор направления. Зависит от того, что больше - этаж назначения или отправления
        if (cur_fl_queue < dst_queue) d1 = UP;
        direct.push_back(d1);
        if ((direct[std::distance(passengers.begin(), k)] == direct[0]))
 
        {
 
            if ((direct[std::distance(passengers.begin(), k)] == UP) & (cur_fl_queue >= ucf) & (cur_fl_queue <= dst_floor))
            {
                Elevation::active_users.push_back({ userid,cur_fl_queue,dst_queue });
                auto level_floor = &std::get<2>(*std::max_element(active_users.begin(), active_users.end(),
                    [](auto& l, auto& r) {return std::get<2>(l) < std::get<2>(r); })); // поиск максимума назначения. Если пользователю по пути, то движемся до максимального этажа последнего пользователя, если вверх. Или минимального, если вниз движение.
                dst_floor_end = level_floor;
            }
 
            if ((direct[std::distance(passengers.begin(), k)] == DOWN) & (cur_fl_queue <= ucf) & (cur_fl_queue >= dst_floor))
            {
                Elevation::active_users.push_back({ userid,cur_fl_queue,dst_queue });
 
                auto level_floor = &std::get<2>(*std::min_element(active_users.begin(), active_users.end(),
                    [](auto& l, auto& r) {return std::get<2>(l) < std::get<2>(r); }));
                dst_floor_end = level_floor;
            }
 
            k = passengers.erase(k);
        }
 
        else ++k;
    
    }
Есть такой код. Задача перенести нужные элементы из passengers в active_users и удалить их из passengers.
Я не могу понять, почему если убрать erase и else ++k , то выборка элементов из первого массива работает,как надо, но при таких условиях я не смогу удалить из начального passengers уже использованные пути пользователей.
Если же оставить как есть, то он переносит в массив active_users не только нужные, но и лишние элементы, не соответствующие условиям в скобках. Поясню. Я выбираю по задачае только те элементы, где при направлении вверх, этаж назначения больше этажа отправления и наоборот для направления вниз. Но при данной реализации erase у меня могут выбраться и лишние, т.е. для движения вверх он перенесет часть пользователей, которым надо вниз из passengers в active_users.
Понятно, что ошибка в вычислениях моих, но где я не увидел? Даже вложил файл с полным кодом.
Вложения
Тип файла: zip Elevation.zip (7.9 Кб, 4 просмотров)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.06.2019, 19:10
Ответы с готовыми решениями:

Перенести элементы одного вектора в другой
Друзья, такая задача, нужна программа, которая разбивала бы слово, которое вводится с клавиатуры на блоки, количество символов в блоке тоже...

Как перенести элементы из одного массива в другой?
как перенести элементы из одного массива в другой ? пример: 5, 6, 7, 8 ,9 хочу перенести только 5, 6, 9 и чтоб массив сократился ...

Перенести все кратные 5 элементы из одного массива в другой
Преподаватель говорит что код не правильный и функция, считающая количество элементов кратная 5 не нужна. Помогите довести до ума...

47
1 / 1 / 0
Регистрация: 23.11.2010
Сообщений: 136
21.06.2019, 21:14  [ТС]
Ну код я тот кидал, нет других, но кину еще раз. Единственное, что я мог спецом erase и итератор на passengers комментировать и наоборот. Сейчас я скину комментированный erase вариант. Попробую расскоментировать и глянуть на loaded. По факту он всегда загружается, так как я в rule- файле (main) задаю два вектора совпадающих.
Миниатюры
Перенести элементы из одного вектора в другой  
Вложения
Тип файла: zip Elevation.zip (7.9 Кб, 0 просмотров)
0
1 / 1 / 0
Регистрация: 23.11.2010
Сообщений: 136
21.06.2019, 21:20  [ТС]
не, заполняется он всегда при обоих вариантах. Хоть расскоментируй, хоть заккоментируй - проверил.

Добавлено через 2 минуты
Цитата Сообщение от zayats80888 Посмотреть сообщение
а для чего вектор active_users?
Если итератор этажа достиг нулевого (по-русски первого) пользователя, и движется снизу вверх (или наоборот), то все пассажиры переносятся в него до достижения нужных этажов. А из вектора ожидания passengers они удаляются. Когда задача решена, то удалятся из active_users (кстати, удаление там не решал), но нужно сначала хотя бы из одного удалить. А дальше по образу.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
21.06.2019, 21:20
пардон, я не туда смотрел, загружается, но active_users заполняется только один раз при запуске программы и не изменяется, не вижу где в коде это
0
1 / 1 / 0
Регистрация: 23.11.2010
Сообщений: 136
21.06.2019, 21:32  [ТС]
ну вот, поиск сужается. Вижу, это другое описание проблемы, точнее, даже расширение ее понимания.

Добавлено через 2 минуты
zayats80888,

Хотя нет, active_users тоже меняет размер, если вставить breakpoint - insert breakpoint. Если просто F9 жать, не меняет, а лишь при запуске, а если брейкпойнт правой кнопкой мыши добавить, то меняет размер, заполняется.

Хм, какого лешего у меня есть и Elevation::active_users и active_users. Вот это перепроверю. Причем если щелкнуть по второму укзавает на первый.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
21.06.2019, 21:34
Что я понял: код который вы показали в топике(с удалением из passengers) выполняется только один раз вначале, тогда же и заполняется active_users. Дальше выбирается самый дальний этаж этаж назначения(из active_users). Далее запускается цикл, пока не доедем до этого дальнего этажа, в котором на каждой итерации производятся манипуляции с loaded(не особо вникал) и active_users(который не меняется). Вектор passangers в цикле вообще не задействован. По достижении дальнего этажа программа завершается. Вот я и не пойму логику всего этого действия.
0
1 / 1 / 0
Регистрация: 23.11.2010
Сообщений: 136
21.06.2019, 21:36  [ТС]
Логика - доехать до дальнего этажа несколькими людьми. Раньше вообще лишь один человек катался.
0
1 / 1 / 0
Регистрация: 23.11.2010
Сообщений: 136
21.06.2019, 21:38  [ТС]
Вот, меняется. Они не могут не меняться, они еще в конце выводятся в тексте.
Миниатюры
Перенести элементы из одного вектора в другой  
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
21.06.2019, 21:44
Цитата Сообщение от streamc Посмотреть сообщение
Вот, меняется.
Цитата Сообщение от zayats80888 Посмотреть сообщение
... выполняется только один раз вначале, тогда же и заполняется active_users.
Цитата Сообщение от zayats80888 Посмотреть сообщение
Далее запускается цикл ... active_users(который не меняется).
Понятно?
0
1 / 1 / 0
Регистрация: 23.11.2010
Сообщений: 136
21.06.2019, 21:56  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
. выполняется только один раз вначале, тогда же и заполняется active_users.
active_users должен взаимодействовать будет с loaded, как passengers взаимодействует с active_users. Но поскольку passengers не удаляется нормально, то active users ом так не занимался. Катит, да и ладно. Последователен я в одинаковых вопросах. Там есть код, но могу допустить, что ошибка похожая. Да, его надо ощищать этот active_users при достижении этажа выгрузки (destination).
Так же в дальшнейшем будет passengers меняться постоянно, ну реально же лифтом кто-то всегда хочет пользоваться. Это может быть либо время, либо реквест через графику. И active_users своего рода производная что-ли passengers будет так же работать, меняться. А если я с passengers не решу, то получу миллион одинаковых пользователей.

Добавлено через 8 минут
Если лифт движется к пользователю вверх то он не может взять пользователя, который нажмет кпопку вниз. Логично.
Так же, если лифт проехал третий этаж, и движется с 5-го на 100-й то пассажир с третьего этажа подождет. Вот такая логика. Ну есть возможность добавить несколько лифтов, усложнить логику. но надо начинать с простого.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
21.06.2019, 22:00
Лучший ответ Сообщение было отмечено streamc как решение

Решение

Цитата Сообщение от streamc Посмотреть сообщение
Но поскольку passengers не удаляется нормально, то active users ом так не занимался. Катит, да и ладно.
Вы показывали скрины работы программы, где что-то не так. Суть в том, что passengers в этой части кода вообще НЕ задействован. По поводу
Цитата Сообщение от streamc Посмотреть сообщение
Если же оставить как есть, то он переносит в массив active_users не только нужные, но и лишние элементы, не соответствующие условиям в скобках.
, то замените все direct[std::distance(passengers.begin(), k)] на direct.back() и убедитесь что direct[0] действителен еще до начала выборки

Добавлено через 2 минуты
streamc, как работаю лифты я знаю, мне трудно понять логику конкретно вашего лифта
1
1 / 1 / 0
Регистрация: 23.11.2010
Сообщений: 136
21.06.2019, 22:15  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
passengers в этой части кода вообще НЕ задействован.
Начинаю догонять, проверю свое.
Цитата Сообщение от zayats80888 Посмотреть сообщение
убедитесь что direct[0] д
Спать уже пора, тоже проверю. Хотя тут меньше понимаю.

Добавлено через 9 минут
Цитата Сообщение от streamc Посмотреть сообщение
Помогает, но почему? Типа длина меняется и поэтому дистанция меняется, ну у меня такая логика.
Почему помогает - допер. Вопрос не так сформулировал. Почему не работала дистанция. Но это не удивительно при изменяющем размер вектор. Действенно.

Я еще тщательнее и нормально все послезавтра буду делать.

zayats80888

Спасибо!
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
21.06.2019, 22:20
Цитата Сообщение от streamc Посмотреть сообщение
Спать уже пора, тоже проверю. Хотя тут меньше понимаю.
Я про то, что ваш лифт выбирает направление движения на основе того, в каком направлении нужно первому из passengers, хотя этот самый пассажир в лифт может и не попасть
1
1 / 1 / 0
Регистрация: 23.11.2010
Сообщений: 136
21.06.2019, 22:24  [ТС]
C++
1
if (std::get<0>(active_users.back()) == (Elevator::loaded.back()))
, разумеется так же.

Добавлено через 42 секунды
Цитата Сообщение от zayats80888 Посмотреть сообщение
Я про то, что ваш лифт выбирает направление движения на основе того, в каком направлении нужно первому из passengers, хотя этот самый пассажир в лифт может и не попасть
А, думал раньше над этим, но решил уже делать. Да, но что такое первый пассажир - это же абстракция. Курица или яйцо?
Над этим лифтом еще очень много работы, как и с архитектуры. оптимизации, программирования, переделеки, конкретики. И так же создателю лифта учиться надо проектированию лифта.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
21.06.2019, 22:28
Цитата Сообщение от streamc Посмотреть сообщение
Да, но что такое первый пассажир - это же абстракция. Курица или яйцо?
Я вот когда на лифте езжу, не считаю себя абстракцией, да и лифт делает то что хочет от него пользователь(как правило)
Кстати амперсанд убирать не нужно было, т. к. int* dst_floor_end = NULL; я просто всего кода не видел еще тогда
1
1 / 1 / 0
Регистрация: 23.11.2010
Сообщений: 136
21.06.2019, 22:30  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Кстати амперсанд убирать не нужно было
Я хотел показать .что хуже особо не будет, потому убрал. Тот код не влиял. int* dst_floor_end = NULL стало int int dst_floor_end
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
21.06.2019, 22:32
Цитата Сообщение от streamc Посмотреть сообщение
Я хотел показать .что хуже особо не будет, потому убрал.
Это правильно, т.к. объект на который он ссылается, по идее будет реаллоцироваться в ходе работы
0
1 / 1 / 0
Регистрация: 23.11.2010
Сообщений: 136
21.06.2019, 22:51  [ТС]
Да, рано радоваться. Поменял этажность с 20 до 200. Теперь он опять вниз катается, когда вверх надо. Точнее, катится вверх, но берет пользователей, которым надо вниз. надо еще больше думать над объектами изменяемыми в ходе итерации, будь то сами итераторы или объекты внутри циклов, условий.

Добавлено через 5 минут
О, сейчас и на 20 не заработал.

Добавлено через 7 минут
Хм. или я масивы уже путать стал. вновь работает. все-таки большую выборку не обманешь.
0
1 / 1 / 0
Регистрация: 23.11.2010
Сообщений: 136
22.06.2019, 21:47  [ТС]
Так. Проверил на коде с floor_count=200. До этого времени со вчерашней ночи прогу не трогал.
Он делает выборку не всех пассажиров. Придется точно засесть.

P.S. Насчет логики лифта, он должен захватывать всех пассажиров по пути к первому пассажиру, если может. В нем такого нет. Реализовать не так и сложно. Доделаю. Ясно, что логика кажется странной. По факту и вес можно добавить. Типа не брать больше определенного количества пассажиров, как пример. Да много чего.


При двадцати этажах работает нормально, при двухсот чаще тоже, но иногда - нет. Значит, ошибка. Неважно, в алгоритме (нет, там ничего сложного нет), еще чем-то, методах или даже компиляции. нужен результат 100 процентов. Хотя я уже на данном этапе могу улучшать работу лифта и сделать подхват пассажиров.

Добавлено через 4 минуты
int level_floor = std::get<2>(*std::max_element(active_use rs.begin(), active_users.end(),

А вот тут логическая ошибка у меня. Я делаю максимум назначения по максимальному назначению этажей входящих в диапазон отправления. По факту максимум там рядом не стоял. проверяется на больших размерностях.
Но это исправимо и не напрягает. Напрягало, что он мог вниз поехать. Но вот не вижу этого пока. Не вижу.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
22.06.2019, 21:51
streamc, все в ваших руках Могу посоветовать взять карандаш и листок бумаги, и хорошенько все обдумать, затем приступать к реализации. Я ваш код переделывать не хочу, мне проще заново написать, но вам это вряд ли поможет, судя по вашему энтузиазму, так что дерзайте. Если что, спрашивайте (только хорошо сформулируйте вопрос в отдельной теме, т.к. эту мы сильно загадили )
0
1 / 1 / 0
Регистрация: 23.11.2010
Сообщений: 136
22.06.2019, 21:57  [ТС]
zayats80888,

Да, он не доделан, и где-то это очевидно, как с тем, что я написал.
У вас все-равно будет своя реализация.
Цитата Сообщение от zayats80888 Посмотреть сообщение
взять карандаш и листок бумаги,
А лучше ворд и структурную схему. Хм. ну ладно, я восприму это как образную вещь. Хотя ручку больше люблю.
Цитата Сообщение от zayats80888 Посмотреть сообщение
но вам это вряд ли поможет, судя по вашему энтузиазму,
Не понял.
Цитата Сообщение от zayats80888 Посмотреть сообщение
Если что, спрашивайте (только хорошо сформулируйте вопрос в отдельной теме, т.к. эту мы сильно загадили
Не сказал бы. Я могу даже конкретизировать. Вот в этой конструкции

for (vector<vec>::iterator k=vec.begin();
it!=vec.end();
/*it++*/)
{

if()
lalala;
else
++it;
}
Если сделать два if программа может весело себя вести. Я еще проверю на том коде.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.06.2019, 21:57

Как перенести все отрицательные элементы из одного массива в другой.
Здравствуйте, уважаемые форумчане. Большая просьба помочь: Как из одномерного массива целых чисел все отрицательные элементы перенести в...

Все элементы вектора, которые встречаются более одного раза, переписать в другой вектор
Все элементы вектора V,которые встречаються более одного раза ,переписать в другой вектор. Задача на С++ помогите решить.

Из одного массива сделать два массива, в один перенести четные элементы, в другой нечетные
Здравствуйте , помогите пожалуйста с такой задачей из одного массива сделать два массива, в один перенести четные елементы, в другой...

Из массива перенести четные элементы в другой массив.А нечетные перенести в другой массив
#include &lt;iostream&gt; #include &lt;locale.h&gt; using nmespace std; main () { int x; int z; int mas; int mas1; int mas2; ...

Четные числа вектора перенести в другой список
Задан список из целых чисел. Удалить (и переписать в другой список) все четные числа с использованием векторов


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru