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

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

26.03.2023, 18:31. Показов 2768. Ответов 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
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
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
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6303 / 3025 / 1053
Регистрация: 01.06.2021
Сообщений: 11,481
26.03.2023, 21:48
Verevkin, я смоделировал такую ситуацию:

C++
1
2
int a = 5;
swap(&a, &a);
Получим а = 0, в то время как std::swap(a, a) значение "а" оставит 5.
2
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
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
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6303 / 3025 / 1053
Регистрация: 01.06.2021
Сообщений: 11,481
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
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
27.03.2023, 11:39
Цитата Сообщение от Verevkin Посмотреть сообщение
C++
1
*Z ^= *V, *V ^= *Z, *Z ^= *V;
Вообще говоря, на современных архитектурах эта функция вообще ничего не оптимизирует, а даже мешает, потому что не дает процессору выполнять ILP (в этой функции строгий порядок вычислений, необходимый для корректного результата).
Что характерно, многие компиляторы знают этот прием, и насильно трансформируют машинный код в обычный обмен местами с использованием третьей переменной (регистра), чтобы повысить ILP-friendly кода. Исходя из этого, в современном мире писать так просто нет смысла.
4
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
27.03.2023, 11:45
DrOffset, а UB здесь таки есть или нет?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
27.03.2023, 11:54
Цитата Сообщение от Алексей1153 Посмотреть сообщение
а UB здесь таки есть или нет?
Если говорить о XOR-swap, то нет.
Если вот об этом варианте (и его модификациях):
C++
1
2
3
    *x = *x + *y;
    *y = *x - *y;
    *x = *x - *y;
то формально UB будет при переполнении
(для знаковых, естественно).
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6303 / 3025 / 1053
Регистрация: 01.06.2021
Сообщений: 11,481
27.03.2023, 11:55
DrOffset, а будет ли переполнение (соответственно и UB) в этом варианте?
C++
1
b = a - b + (a = b);
Я проверил с помощью предельных чисел для типа int, никакого переполнения не случилось. Но может вы мне поможете найти случай, когда будет UB.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
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
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6303 / 3025 / 1053
Регистрация: 01.06.2021
Сообщений: 11,481
27.03.2023, 12:16
DrOffset, я если честно не совсем понял. По вашей ссылке "Order of evaluation" говорится о том, что компилятор может вычислять части выражения в произвольном порядке. Тем не менее, мне кажется, это не играет никакой здесь роли. Ну и пусть вычисляет эти части в произвольном порядке, главное, чтобы соблюдал "C++ Operator Precedence".
Я именно хотел увидеть от вас конкретный случай UB с предложенным мной вариантом. Ведь, это не то же самое, что и ваш вариант, хоть с виду и там и там сложение/ вычитание.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
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
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6303 / 3025 / 1053
Регистрация: 01.06.2021
Сообщений: 11,481
27.03.2023, 12:32
DrOffset, ладно, буду разбирать ваш ответ, чтобы понять.

Просто в https://en.cppreference.com/w/... precedence говорится, что у сложения и вычисления ассоциативность "Left-to-right". Учитывая это и то, что то, что в скобке, вычислится раньше, то думал, что вроде с порядком вычислений норм.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
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
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6303 / 3025 / 1053
Регистрация: 01.06.2021
Сообщений: 11,481
27.03.2023, 12:45
Цитата Сообщение от DrOffset Посмотреть сообщение
Потому что UB (undefined) - это отсутствие гарантий, а не какой-то конкретный спецэффект.
я хотел спецэффектов короче, этот С++ получается не дает вообще никаких гарантий, что не читаешь в документации, потом оказывается, что где-то есть оговорка, что это может так не работать. Так а как изучать язык? Напоминает законы некоторых стран, в которых приводится на несколько страниц список прав гражданина, типа что он может требовать у государства, а дальше в последней строке прописано, что государство на свое усмотрение и без всякой мотивации может отказать гражданину в реализации этих правах.
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
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
Ответ Создать тему
Новые блоги и статьи
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru