0 / 0 / 0
Регистрация: 26.03.2023
Сообщений: 3

Заменить swap стандартной командой

26.03.2023, 18:31. Показов 2831. Ответов 59
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно заменить swap стандартными командами
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
using namespace std;
 
const int N = 17;
const int A = 4;
const int B = 19;
int mas[N];
 
void vvod_rnd() {
    rand;
    for (int i = 0; i < N; i++) {
        mas[i] = rand() % (B - A + 1) + A; 
    }
}
 
void vivod() {
    cout << "Masiv:" << endl;
    for (int i = 0; i < N; i++) {
        cout << mas[i] << " ";
    }
    cout << endl;
}
 
void sort_vkl() {
    for (int i = 0; i < N - 1; i++) {
        for (int j = i + 1; j < N; j++) {
            if (mas[i] > mas[j]) {
                swap(mas[i], mas[j]);                  
            }
        }
    }
}
 
int main() {
    vvod_rnd();
    vivod();
    sort_vkl();
    vivod();
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.03.2023, 18:31
Ответы с готовыми решениями:

Как перевести массив в шестнадцатеричную систему стандартной командой?
как перевести массив в шестнадцатеричную систему стандартной командой имею код программы, нужно результат получить в HEX, пробовал с ...

Использование std::swap() вместо friend swap() при реализации Copy&Swap в современном С++
Добрый день! При реализации Copy&amp;Swap традиционно для класса создается дружественная функция swap(), которая используется в перегруженном...

Заменить функцию со swap
Заменить функцию с командой swap на альтернативу #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;cstdlib&gt; #include...

59
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
26.03.2023, 21:27
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Алексей1153 Посмотреть сообщение
не найду
А ты попробуй смоделировать. Штоб вот такая функция вернула неверный результат:
C
1
2
3
4
void swap(int* Z, int* V)
{
  *Z ^= *V, *V ^= *Z, *Z ^= *V;
}
Если получится - с меня пузырь!
0
фрилансер
 Аватар для Алексей1153
6499 / 5730 / 1133
Регистрация: 11.10.2019
Сообщений: 15,325
26.03.2023, 21:37
Verevkin, я даже пытаться не буду Я так никогда не делаю и другим не советую. Это в ассемблере канает, а с C++ надо осторожно. Интуиция мне подсказывает - так нельзя
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
26.03.2023, 21:43
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Это в ассемблере канает, а с C++ надо осторожно. Интуиция мне подсказывает - так нельзя
Набери в гуглЕ:

Я спать.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
26.03.2023, 21:48
Verevkin, я смоделировал такую ситуацию:

C++
1
2
int a = 5;
swap(&a, &a);
Получим а = 0, в то время как std::swap(a, a) значение "а" оставит 5.
2
фрилансер
 Аватар для Алексей1153
6499 / 5730 / 1133
Регистрация: 11.10.2019
Сообщений: 15,325
26.03.2023, 21:53
Royal_X, он спать ушёл
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
26.03.2023, 22:04
Цитата Сообщение от Royal_X Посмотреть сообщение
я смоделировал такую ситуацию
Ну это ж одна ячейка памяти. Не надо так использовать эту функцию.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <cassert>
using namespace std;
 
void swap(int* Z, int* V)
{
  assert(Z != V);
  *Z ^= *V, *V ^= *Z, *Z ^= *V;
}
 
int main()
{
  int a = 5, b = 5;  
  swap(&a, &b);
  cout << a << " " << b;
  return 0;
}
Добавлено через 7 минут
Признаю, что неправ. Когда я писал на Си, у меня эта функция спёрта была откуда-то из классики. И в ней такая ситуация была учтена.
C
1
2
3
4
void swap(int* Z, int* V)
{
  if (Z != V) *Z ^= *V, *V ^= *Z, *Z ^= *V;
}

Но это явно не UB, а очень даже предсказуемое поведение.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
26.03.2023, 22:07
Verevkin, сейчас вообще не компилируется
error: invalid operands of types 'void' and 'int*' to binary 'operator*' на 8 строке
Как комментирую 7 строку с assert, ошибка пропадает
0
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
26.03.2023, 22:09
Цитата Сообщение от Royal_X Посмотреть сообщение
сейчас вообще не компилируется
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
inline void swap(int* Z, int* V)
{
  if (Z != V) *Z ^= *V, *V ^= *Z, *Z ^= *V;
}
 
int main()
{
  int a = 5, b = 5;  
  swap(&a, &a);
  cout << a << '\n';
  swap(&a, &b);
  cout << a << " " << b;
  return 0;
}
1
Злостный нарушитель
 Аватар для Verevkin
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
26.03.2023, 22:10
Цитата Сообщение от Royal_X Посмотреть сообщение
error: invalid operands of types 'void' and 'int*' to binary 'operator*' на 8 строке
Как комментирую 7 строку с assert, ошибка пропадает
Старый вариант:
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
27.03.2023, 11:39
Цитата Сообщение от Verevkin Посмотреть сообщение
C++
1
*Z ^= *V, *V ^= *Z, *Z ^= *V;
Вообще говоря, на современных архитектурах эта функция вообще ничего не оптимизирует, а даже мешает, потому что не дает процессору выполнять ILP (в этой функции строгий порядок вычислений, необходимый для корректного результата).
Что характерно, многие компиляторы знают этот прием, и насильно трансформируют машинный код в обычный обмен местами с использованием третьей переменной (регистра), чтобы повысить ILP-friendly кода. Исходя из этого, в современном мире писать так просто нет смысла.
4
фрилансер
 Аватар для Алексей1153
6499 / 5730 / 1133
Регистрация: 11.10.2019
Сообщений: 15,325
27.03.2023, 11:45
DrOffset, а UB здесь таки есть или нет?
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
27.03.2023, 11:54
Цитата Сообщение от Алексей1153 Посмотреть сообщение
а UB здесь таки есть или нет?
Если говорить о XOR-swap, то нет.
Если вот об этом варианте (и его модификациях):
C++
1
2
3
    *x = *x + *y;
    *y = *x - *y;
    *x = *x - *y;
то формально UB будет при переполнении
(для знаковых, естественно).
1
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
27.03.2023, 11:55
DrOffset, а будет ли переполнение (соответственно и UB) в этом варианте?
C++
1
b = a - b + (a = b);
Я проверил с помощью предельных чисел для типа int, никакого переполнения не случилось. Но может вы мне поможете найти случай, когда будет UB.
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
27.03.2023, 12:14
Цитата Сообщение от Royal_X Посмотреть сообщение
а будет ли переполнение (соответственно и UB) в этом варианте?
C++
1
b = a - b + (a = b);
Здесь UB будет из-за неупорядоченного изменения a.
https://en.cppreference.com/w/... eval_order
Компилятор должен (может) об этом предупреждать, кстати.
Так что наверное далее этот вариант нет смысла рассматривать.

Цитата Сообщение от Royal_X Посмотреть сообщение
Я проверил с помощью предельных чисел для типа int, никакого переполнения не случилось.
На примере моего варианта переполнение конечно же случается, но обрабатывается ожидаемым образом (на intel вы на спецэффекты из-за этого точно не налетите).
Но ожидаемое поведение - это частный случай UB

Unsigned integers не переполняются (для них действует арифметика по модулю), поэтому если нужны какие-то гарантии для варианта со сложением, то нужно использовать беззнаковые целые вместо знаковых.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
27.03.2023, 12:16
DrOffset, я если честно не совсем понял. По вашей ссылке "Order of evaluation" говорится о том, что компилятор может вычислять части выражения в произвольном порядке. Тем не менее, мне кажется, это не играет никакой здесь роли. Ну и пусть вычисляет эти части в произвольном порядке, главное, чтобы соблюдал "C++ Operator Precedence".
Я именно хотел увидеть от вас конкретный случай UB с предложенным мной вариантом. Ведь, это не то же самое, что и ваш вариант, хоть с виду и там и там сложение/ вычитание.
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
27.03.2023, 12:24
Цитата Сообщение от Royal_X Посмотреть сообщение
Ну и пусть вычисляет эти части в произвольном порядке, главное, чтобы соблюдал "C++ Operator Precedence".
C++ Operator Precedence - это про разбор выражений, а не про порядок вычислений.

Цитата Сообщение от Royal_X Посмотреть сообщение
я если честно не совсем понял. По вашей ссылке "Order of evaluation" говорится о том, что компилятор может вычислять части выражения в произвольном порядке.
Я не спорю - это непростая тема, поэтому вам разумнее взять паузу, чтобы получше разобраться.
В качестве короткого ответа, по моей ссылке есть пример:
If a side effect on a memory location is unsequenced relative to a value computation using the value of any object in the same memory location, the behavior is undefined.
C++
1
n = ++i + i;      // undefined behavior
У вас то же самое:
b = a - b + (a = b);
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
27.03.2023, 12:32
DrOffset, ладно, буду разбирать ваш ответ, чтобы понять.

Просто в https://en.cppreference.com/w/... precedence говорится, что у сложения и вычисления ассоциативность "Left-to-right". Учитывая это и то, что то, что в скобке, вычислится раньше, то думал, что вроде с порядком вычислений норм.
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
27.03.2023, 12:44
Цитата Сообщение от Royal_X Посмотреть сообщение
Просто в https://en.cppreference.com/w/... precedence говорится, что у сложения и вычисления ассоциативность "Left-to-right".
Читайте дальше целиком, вот отрывок:
When parsing an expression, an operator which is listed on some row of the table above with a precedence will be bound ...
Добавлено через 7 минут
Royal_X, О, и даже далее по этой же ссылке там есть совсем уж прямое указание:
Precedence and associativity are compile-time concepts and are independent from order of evaluation, which is a runtime concept.
Собственно о чем и я речь веду.
Хорошо, что теперь есть источники, где об этом пишут явно, а то раньше в таких ситуациях все время чувствую себя героем рассказа Шукшина.
----------------

Цитата Сообщение от Royal_X Посмотреть сообщение
Я именно хотел увидеть от вас конкретный случай UB с предложенным мной вариантом.

Вижу вы не совсем понимаете что такое UB.
Если ваш код работает как положено (как вы ждете), но при этом для этого случая в стандарте не предусмотрено гарантий такой работы, то это тоже считается за "увидеть конкретный случай UB". Потому что UB (undefined) - это отсутствие гарантий, а не какой-то конкретный спецэффект.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
27.03.2023, 12:45
Цитата Сообщение от DrOffset Посмотреть сообщение
Потому что UB (undefined) - это отсутствие гарантий, а не какой-то конкретный спецэффект.
я хотел спецэффектов короче, этот С++ получается не дает вообще никаких гарантий, что не читаешь в документации, потом оказывается, что где-то есть оговорка, что это может так не работать. Так а как изучать язык? Напоминает законы некоторых стран, в которых приводится на несколько страниц список прав гражданина, типа что он может требовать у государства, а дальше в последней строке прописано, что государство на свое усмотрение и без всякой мотивации может отказать гражданину в реализации этих правах.
0
фрилансер
 Аватар для Алексей1153
6499 / 5730 / 1133
Регистрация: 11.10.2019
Сообщений: 15,325
27.03.2023, 12:52
Цитата Сообщение от Royal_X Посмотреть сообщение
Так а как изучать язык
постепенно
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.03.2023, 12:52

Заменить функцию swap
У меня есть программа. Я задаю массив, потом мне выводится массив, в котором удаляются все повторяющиеся элементы. Как можно заменить...

Чем можно заменить функцию swap?
Чем можно заменить функцию swap? Она на моем компиляторе не работает. Библиотеку iostream включал.

Как заменить одной командой
как заменить вот этот код на одну строчку for (i = 0; i &lt; kol; i++) fread((mas_Z + i), size, 1, Fz); fclose(Fz); ...

Какой командой можна заменить msconfig ?
Ребята подскажите, какой командой можна заменить msconfig ОС Windows 2000, а то в 98 и ХР эта команда есть а 2000 нет или может как-то...

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


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

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

Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru