originalnii,
Вообще-то, без разницы, что у вектора erase_if вызывать, что у set, что у вектора через partition удалять - время одинаково линейное. Я вообще подозреваю, что vector::erase_if внутри себя partition вызывает. Не городите лишний код, пишите через erase_if. Я подозреваю, что vector::erase_if будет немного быстрее засчет особенностей работы процессора, но это какие-то проценты ускорения.
Если вам известно какое-то особое свойство предиката (типа, если строка X подошла, то все строки большие ее - тоже подойдут), то можно думать над чем-то более быстрым. Например, поддерживать вектор отсортированным и через бинарный поиск найти первую удаляемую строку и потом просто изменить size у вектора, без деаллокаций и удаления элементов. Но тут встает вопрос баланса - а как строки в этот вектор попадают и меняется ли он где-либо еще. Может там из-за сортированности массива будет сильно хуже. А сортировать вектор перед удалениями будет медленнее текущего метода.
Вопрос чистого любопытства: std::placeholders::_1 - это указатель на текущий элемент, который просматривает stable_partition?
Да. Почитайте по ссылке в документации. _1 будет аргументом переданным предикату внутри partition или erase_if. Это все элементы контейнера по одному.
если я и так работаю в пространстве имён std, то его можно не указывать
Да, можно не указывать. Всегда достаточно в начале файла указать и внутри нигде не писать std::. Но лучше этого не делать. От лишних std:: пальцы не отвалятся, а выстрелить себе в ногу шансов меньше.
Возьмите листок в клеточку и нарисуйте на нем перевернутый график С и график B вместе. Советую взять 5 клеточек за 1 по каждой из осей . Ваш ответ - самый верхний график для каждого x. Найдите на графике точку пересечения двух линий.
При графическом определении функций принадлежности объединенного множества необходимо в каждой точке множества выбрать максимальное значение из двух (точку того графика, который выше) и объединить все полученные точки в график
im_noob, Я не знаю. Есть много разных теорий. В одной - для пересечения надо тупо перемножить 2 функции. У вас, судя по графикам 3 и 4, что-то другое. Смотрите теорию, там должно быть написано. Может максимумы/минимумы берутся, может еще что-то.
im_noob, Не совсем понял, что вы там собрались делать. Для B нарисован какой-то график. Назовем его f(x). Для НЕ B надо построить график 1-f(x), т.е. взять данный график и отразить его вертикально.
IliaNeverov, Функция в С++ всегда что-то возвращает, если она не void. Иначе программа не скомпилируется. Какой тип функция возвращает указано в декларации функции.
LoliDeveloper, если в программе есть undefined behavior, то компилятор может и не такие странные фокусы устроить. Может, он решает, что main_queue инициализирует я неправильно и поэтому всегда будет 0, но из-за каких-то еще эффектов решил поименить это только внутри push.
im_noob, Не нужно построчно писать printf. Надо все вычисления сделать отдельно, а в printf передать уже подсчитанные значения. Сначала домножили eps, вычислили функцию и только потом передали 2 переменные в printf. Заодно код работать будет быстрее и короче, если потом вместо повторных вызовов функции брать уже подсчитанную переменную.
im_noob, Еще раз, внутри printf аргументы могут вычислятся в любом порядке.
Поэтому вы не знаете, какое значение eps ушло в MyExp(x, eps) внутри printf. eps *= 0.1 могло выполнится до или после. Это называется Undefined Behavior, и, вообще говоря, компилятор имеет право отформатировать ваш диск, если вы такую программу запускаете.
im_noob, Относительную на 100 домножайте, если в процентах. на 1 домножать, как у вас - смысла нет.
И или у вас перпод - идиот, или вы его не поняли. У вас там ошибка из-за запихивания всего внутрь printf. Во-первых, сказано подсчитать с еps =0.1, 0.01, 0.001 ... А ваша программа выводит 0.01, 0.001, 0.0001 ... В 10 раз меньше числа выводит. Плохо же, да?
Во-вторых, order of evaluation:
Компилятор может решить домножать eps на 0.1 до того, как передаст его в MyExp, или после. Что вы-то хотите сделать, какое значение eps передать в функцию?
Вызывайте функции в отдельных строчках и сохраняйте значения в переменные.
Вообще-то, без разницы, что у вектора erase_if вызывать, что у set, что у вектора через partition удалять - время одинаково линейное. Я вообще подозреваю, что vector::erase_if внутри себя partition вызывает. Не городите лишний код, пишите через erase_if. Я подозреваю, что vector::erase_if будет немного быстрее засчет особенностей работы процессора, но это какие-то проценты ускорения.
Если вам известно какое-то особое свойство предиката (типа, если строка X подошла, то все строки большие ее - тоже подойдут), то можно думать над чем-то более быстрым. Например, поддерживать вектор отсортированным и через бинарный поиск найти первую удаляемую строку и потом просто изменить size у вектора, без деаллокаций и удаления элементов. Но тут встает вопрос баланса - а как строки в этот вектор попадают и меняется ли он где-либо еще. Может там из-за сортированности массива будет сильно хуже. А сортировать вектор перед удалениями будет медленнее текущего метода.
Да. Почитайте по ссылке в документации. _1 будет аргументом переданным предикату внутри partition или erase_if. Это все элементы контейнера по одному.
Да, можно не указывать. Всегда достаточно в начале файла указать и внутри нигде не писать
std::
. Но лучше этого не делать. От лишних std:: пальцы не отвалятся, а выстрелить себе в ногу шансов меньше.Edit: изменил начало.