|
0 / 0 / 0
Регистрация: 19.08.2016
Сообщений: 23
|
|
Как реализовать смещение элементов вектора?24.08.2016, 15:24. Показов 12091. Ответов 36
Подскажите, пожалуйста, как без костылей переместить заданный элемент вектора на нужную позицию, а те, что до/после него сместить влево/вправо? Т. е., например, есть {1, 5, 3, 9, 7, 4} и мне нужно единицу переместить на четвёрутю (если считать от 1) позицию, чтобы получилось {5, 3, 9, 1, 7, 4}? Может, такое в STL есть? Сначала подумал, что подойдёт rotate(), но он не подходит.
0
|
|
| 24.08.2016, 15:24 | |
|
Ответы с готовыми решениями:
36
Реализовать сдвиг элементов вектора Круговое смещение в массиве, как лучше реализовать Как удалить часть элементов вектора или как присвоить вектору часть другого вектора? |
|
Комп_Оратор)
|
||
| 30.08.2016, 13:31 | ||
|
Как реализовать смещение элементов вектора? где не работает? Только не в смысле того, что им нельзя забивать гвозди, а в соответствии с заданным вопросом. Последний вариант конечно не будет и в одном потоке работать. Может реалок сломать итераторы. И повторю ещё раз. Вектор для такой задачи, это конечно тоже, направленный отрезок, но в глаз компилятору.
0
|
||
|
0 / 0 / 0
Регистрация: 19.08.2016
Сообщений: 23
|
||
| 30.08.2016, 13:49 [ТС] | ||
|
Чем конкретно использование списка будет лучше, чем вышеперечисленные алгоритмы, не будут ли со списком возникать сегфолты? Спасибо за ответы.
0
|
||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
|
|
| 30.08.2016, 13:49 | |
|
JustOneProblem, сначала надо баги исправить, связанные с выходом за пределы диапазона вектора. И логическую нестыковку в функции level_range. Позадаю наводящие вопросы:
* что возвращается в level_range, если не найден подходящий элемент?* что будет, если вот в этом коде &task[number(task, task[j].depends) - 2] функция number вернет 0 или 1?
0
|
|
|
0 / 0 / 0
Регистрация: 19.08.2016
Сообщений: 23
|
|||
| 30.08.2016, 14:05 [ТС] | |||
&task[number(task, task[j].depends) - 2] у меня уже нет, есть &task[number(task, task[j].depends)-1], а number никогда не вернёт 0 (в данном контексте, потому что некорректно заданные секции во входном файле отсеиваются) , минимальное значение -- 1.
0
|
|||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
|
|
| 30.08.2016, 16:32 | |
|
JustOneProblem, ну вот как вы так программируете, а?
![]() Есть у тебя контракт, ты его неявно подразумеваешь. Но ты можешь быть уверен, что он выполняется? Нет, не можешь. А другие, люди, которые смотрят твой код? Тем более не могут, потому что они не видят исходных данных. Ну вот возьми и расставь везде явно контракты, расставь ассерты, которые проконтролируют соблюдение контрактов. Программа будет падать на ассертах, а не случайных местах. Увидев место, где нарушается контракт - ты сможешь исправить ошибку. А отсутствие возвращаемого значения в не-void функции - это UB. Оно должно быть. Оно должно быть и ты потом должен его проверить. Если в программе получилось нарушение контракта и вернулось значение, которое в нормальной ситуации быть не может, - ты должен его проверить в ассерте. До тех пор, пока контракты присутствуют только неявно, программирование будет оставаться на уровне эмпирических ощущений, а им верить нельзя. Добавлено через 6 минут Ну и программу отладь сперва в однопоточном варианте. Чтобы не думалось. А то вот у тебя там используется общий для всех потоков вектор, а модифицируешь ты элементы в нем без синхронизации. Ни к чему хорошему это не приведет.
1
|
|
|
0 / 0 / 0
Регистрация: 19.08.2016
Сообщений: 23
|
|||||||
| 30.08.2016, 23:47 [ТС] | |||||||
По-хорошему, надо бы уже осилить настройку neovim, cmake и всего остального, код в пригодный вид привести, а не писать "на коленке": в gedit, компилируя всё одним вызовом g++. Но вот ради этого всего я и сел писать программу, которая мне поможет to-do list отсортировать. Замкнутый круг получается...Далее прошу сильно не пинать, потому что, наверное, буду глупые вопросы задавать.
0
|
|||||||
|
Комп_Оратор)
|
|
| 31.08.2016, 01:55 | |
|
Вот он настоящий диалог. Глубокое взаимопонимание по всем достигнутым точкам соприкосновения в процессе созревания. Меня терзают противоречия от того, что хочется поучаствовать, но непонятно, что тут имело бы смысл сказать.
JustOneProblem, Вы отважный человек. Глядя на последний пост я перечитал всю тему и мне показалось, что финт с перестановкой элементов Вам вообще не нужен. Это следует вот из этого: Как реализовать смещение элементов вектора? Сортировать поэтапно, по разным условиям, это плохо. Лучше составить сложный предикат. То есть при равенстве уровней проверяется старшинство depense. Как я понял его значение "none" - самое маленькое значение. Но нужны ещё какие-то. И для тех, что "none" (равны по данному качеству) нужно следующее качество сравнения. Иначе элементы могут оказаться не сравнимы и как следствие не упорядочиваемы. Если сравнение младших уровней как-то зависит от результатов сравнения старших то придётся съесть много рыбы. Если зависимость прослеживается вниз то, лучше бросить всё это. Скорее всего у Вас нет подобных ужасов и Вы точно представляете как сравниваются элементы. Потому как это 99% задачи. Если Вам удалось что-то понять, дайте знать. Потому что мне пока не удалось.
0
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
|
||||||||||||||
| 31.08.2016, 09:08 | ||||||||||||||
|
Когда ты говоришь: И в остальном, т.е. набор допустимых входных данных и выходных данных - это контракт. Вот пример:
assert(s != NULL); переводится как Утверждаю, что переменная s не должна быть равной NULL. Чем это поможет: если ты, по ошибке или недосмотру вызываешь функцию print с передачей нулевого указателя вместо строки, то программа упадет на ассерте с указанием условия, которое ты написал в его аргументе. Т.е. примерно так:
Тоже самое я предлагаю тебе сделать для твоих функций. Определиться с тем, что они должны принимать, и что они НЕ должны принимать, что они должны возращать, и что они НЕ должны. И все эти вещи явно задекларировать. После этого уже работать над самими алгоритмами. Если где-то ты нарушаешь собственные правила - ты узнаешь об этом вышеуказанным способом. Добавлено через 14 минут Просто на всякий случай добавлю про ассерты: assert — это не просто условие во время исполнения программы, в первую очередь - это инструмент отладки. Проверять им нужно только те ошибки, которые может допустить программист, но никак не пользователь. Т.е. ассерт - это сигнал, что в коде и логике автора кода что-то пошло не так. Какую вообще задачу решает программа? * Предоставить компилируемый код, который иллюстрирует проблему; * Предоставить краткое описание задачи, которую выполняет программа ("программа должна переместить элемент в векторе" - это не описание задачи, это описание гвоздя в большом доме - а как выглядит дом, все еще неизвестно). Если используется специализированная расчетная часть - дать ссылки на теорию или указать используемый метод; * Предоставить актуальные входные данные; * Предоставить ожидаемые выходные данные; * Предоставить диагностическую информацию, которую удалось добыть самостоятельно. Возможно что-то из этого в конкретном случае не понадобится, но это общий вид, в котором нужно задавать вопрос. Во-первых пока ты все это собираешь - можешь сам найти ошибку. Во-вторых - с этим можно сразу работать, а не тратить время на вытаскивание клещами информации - это ведь никому не интересно. Многие просто проходят мимо, если не видят, что с вопросом можно работать. Ты серьезно увеличишь шанс быстрой помощи, если дашь людям больше материала для анализа.
6
|
||||||||||||||
|
0 / 0 / 0
Регистрация: 19.08.2016
Сообщений: 23
|
|||||||||||||||||||||||||||
| 31.08.2016, 17:40 [ТС] | |||||||||||||||||||||||||||
|
DrOffset, спасибо за разъяснение. А теперь про то, что должна делать программа. Изначально не запихнул всё в ОП, потому что без этого можно было обойтись, но теперь и правда нужно показать всё целиком. Для начала, вот ссылки на все файлы: everyone.h: http://pastebin.com/Dba7fGaf main.cpp: http://pastebin.com/VtwkV0ai get.cpp: http://pastebin.com/BnNVikdF number.cpp: http://pastebin.com/amK8NXZy make.cpp: http://pastebin.com/jLQEvWrv В invoke.cpp только
Действия программы: Сначала, в файле todo.today задаются секции (порядок переменных произвольный; если заначение переменной не задано, используется дефолтное): { title строка level n ∈ N description строка depends строка urgency n ∈ [1; 20] importance n ∈ [1;20] } Функция get парсит содержимое файла в вектор из элементов структуры, предварительно проверяя каждую секцию на корректность (из комментария к функции correct должно быть понятно, как, не хочу повторяться). Потом вызывается функция make, в которой: 1. С помощью алгоритма sort и функции sort_levels все элементы вектора сортируются по значению level от меньшего к большему. 2. Создаются несколько потоков в кол-ве, равном кол-ву уровней (максимальному значению level среди всех элементов), обрабатывающих функцией sort_nice_depends каждый из уровней. 3. Цикл, делающий всем потокам join. В функции sort_nice_depends: 1. Объявление переменных для упрощения написания. 2. Сортировка с помощью rotate таким образом, что элементы, у которых значение depends != "none", будут помещены ниже, чем те, у которых наоборот. 3. Сортировка с помощью sort и функции sort_nice (элементы с большим nice() становятся выше) отдельно на промежутках с элементами, у которых depends равно и не равно "none". 4. Проблемная часть: здесь с помощью rotate (или функции rotate_to_dep) все элементы, у которых depends != "none", должны перемещаться вверх по списку на позицию, следующую за позицией элемента, у которого значение title равно значению depends текущего элемента, если их уровни равны. Но происходит ошибка сегментации. Если строчку unsigned int begin_depends = level_range(task, level, "begin_depends"); перенести так, чтобы она была после цикла for (unsigned int j(begin); j <= end; j++) {, то резуьтат не изменяется.Входной файл: http://pastebin.com/PDGZdjsw Вывод программы без выполнения "проблемной" части(всё как надо):
Конечная цель программы состоит в том, чтобы выводить на экран список дел, отстртированный по уровню nice и зависимостям, уровни придуманы для того, чтобы одно дело можно было разбить на несколько частей. То есть окончательный вывод (функцией output) программы для входного файла выше должен выглядеть примерно так:
Надеюсь, это было достаточно подробно (ещё в самом коде есть комментарии). З. Ы. Пока писал это сообщение обнаружил небольшой баг в сортировке по nice тех элементов, у которых depends != "none", но он только приведёт к тому, что завсисмости дела будут отсортированы в обратном порядке.
0
|
|||||||||||||||||||||||||||
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
| 31.08.2016, 18:46 | |
|
2
|
|
|
0 / 0 / 0
Регистрация: 19.08.2016
Сообщений: 23
|
|
| 31.08.2016, 21:07 [ТС] | |
|
0
|
|
| 31.08.2016, 22:28 | ||
|
Не по теме: JustOneProblem,
0
|
||
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
||
| 31.08.2016, 22:34 | ||
|
JustOneProblem, мне кажется, ваша задача на данный момент - освоить формулирование задач в ясном и простом виде, - это уже будет половина решения. Вы можете не объяснять ничего, а привести пример отсортированных структур по вашему критерию?
0
|
||
|
0 / 0 / 0
Регистрация: 19.08.2016
Сообщений: 23
|
|||
| 31.08.2016, 22:37 [ТС] | |||
![]() Добавлено через 2 минуты
0
|
|||
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
||
| 31.08.2016, 22:47 | ||
|
Ибо из неясной и запутанной формулировки кроме взаимного запудривания мозгов ничто проистечь не может. Что данная тема и подтверждает!
0
|
||
| 31.08.2016, 22:50 | ||
|
Не по теме:
Сложности возникают с сортировкой элементов взаимосвязанных по критерию title<->depends.(тут можно предварительно собрать map<title,dep>, или может другую мапу, а может и сета хватит, я точно не понимаю и мне лень думать :pardon: закинув его в предикат вы сможете сравнивать к разным или к одной группе сравниваемые элементы относяятсяя и в каком порядке эти группы находятся, что и нужно помимо простых сравнений. Вот структурируйте эту информацию у себя в голове.
0
|
||
|
Комп_Оратор)
|
|
| 31.08.2016, 23:20 | |
|
Nosey, боюсь что кроме составления сложных предикат тут есть ещё проблемы. Похоже пишется что-то вроде органайзера. Причём задачи поступают из жизни в произвольном порядке и некоторые из них могут быть зависимы (подчинены например, другим). Если это не мои фантазии, то тут важнее всего создать
Учитывая, что проблема возникла как перегруппировка элементов в векторе, всё это похоже на желание переключиться и поговорить. Хотя и тут легко ошибиться.
0
|
|
| 31.08.2016, 23:20 | |
|
Помогаю со студенческими работами здесь
37
Можно ли так реализовать смещение?
Найти другой вектор, в котором только не повторяющиеся элементы первого вектора - как реализовать проверку на буквы?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo
https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html
и его же старой инструкции по установке Lazarus с gtk2. . .
|
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер.
Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
|
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта
Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
|
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром.
возможно получится прикрутить интерпретатор питон для кастомизации игровой логики.
что есть на текущий момент:. . .
|
|
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2.
Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
|
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
|
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2.
Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
|
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2.
Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом.
В. . .
|