Выполнение операторов в 'parallel'

В python мне приходилось менять значения двух переменных, все, что вам нужно было сделать

x,y=y,x 

Можно смотреть на него так, как если бы два утверждения – (x = y) и (y = x) выполнялись параллельно, а не один за другим.

Есть ли способ достичь такого же эффекта в c ++?

NOTE / EDIT:

Я хочу расширить этот «параллельный эффект» (если он существует) на более сложные выражения, такие как
ones,twos= (ones ^ n) ^ ~twos, (ones & n) | (twos & ~n);

Это возможно в python, возможно ли это в c ++?

ВЫВОД:

Поэтому в соответствии с ответом, данным leemes, и комментариями к его ответу:

1.Вы можете использовать библиотеки boost в C ++ 03 или

2.Вы можете использовать C ++ 11

для доступа к std::tie и std::tuple для достижения этого «параллельного» эффекта. Что касается настоящего, я отмечаю ответы leemes как принятые, но я все равно буду искать методы для реализации этой классной функциональности на C ++ 03.

2 Solutions collect form web for “Выполнение операторов в 'parallel'”

Специальный случай: замена значения двух переменных

(Общее решение см. Ниже).

Чтобы поменять значения двух переменных на C ++, вы всегда должны использовать swap :

 using std::swap; swap(x, y); // Do NOT say: std::swap(x, y) -- Read about Koenig lookup! 

Не беспокойтесь, как он это сделает; он будет делать это очень быстро . Реализация стандартной библиотеки C ++ сделает все возможное, чтобы оптимизировать ее до одной инструкции, если процессор поддерживает ее (но стандарт не говорит об этом реализации). Для переменных только для регистров существует, например, инструкция x86 xchg которая сделает это как можно быстрее. Не пытайтесь настроить его с помощью «трех операций xor», это не будет быстрее. Если вам не повезло, он не будет оптимизирован для чего-то вроде xchg .

Общая операция swap в C ++ 03 вводит временную переменную и выполняет три копии. В C ++ 11 есть перемещение-семантика, и объекты скорее перемещаются, чем скопированы. Для ваших собственных типов , скажем, некоторой структуры данных, которая содержит только указатель на фактические данные, вы должны оптимизировать эту процедуру, чтобы заставить ее выполнять в постоянное время:

  • В C ++ 03 вы можете либо специализировать std::swap либо реализовать свою собственную функцию swap в своем пространстве имен (см. Два верхних ответа на этот вопрос), чтобы оптимизировать обмен: просто поменяйте каждый член вашего класса, чтобы поменять свои данные. Для примера структуры данных, содержащего только указатель, просто поменяйте указатели.

  • В C ++ 11 есть новая семантика перемещения , которая позволяет вам осуществлять перемещение данных от одного к другому объекту, что приведет к очень похожему поведению. (Перемещение семантики было введено для более общих проблем, таких как обмен двумя объектами: если один объект больше не нужен, но другой должен быть «копией» первого, его можно просто перемещать.) Читайте о семантике перемещения и переместите конструктор для деталей.

  • Для C ++ 03 и C ++ 11 существует альтернативный способ: вы можете реализовать неявно общие данные и копировать-на-запись для тяжелых классов, таких как структуры данных. В приведенном выше примере, где ваша структура данных содержит указатель на фактические данные, выполните подсчет ссылок. При копировании структуры данных просто увеличьте контрольный счетчик на единицу. При изменении данных убедитесь, что он не является общим (ref count = 1), иначе «отделите» его, скопировав его только тогда. Это приводит к операции копирования и свопинга с постоянным временем.


Общий случай: множественные произвольные выражения

Для других операторов, которые не зависят от ввода / вывода, например (a, b) = (x, y) , просто напишите их «как есть», и он будет работать как минимум отлично конвейерно, так как они не имеют никакой зависимости:

 a = x; b = y; 

Если они зависят от ввода / вывода, как и ваш пример в редактировании, вы можете разделить его и ввести временные ряды. Вы не сделаете себе одолжение, пытаясь решить такие с помощью причудливых трюков выражения, таких как xor-ing. Компилятор знает много трюков для ассемблера (например, xchg ), вы знаете только трюки, чтобы выразить их на простом C ++ (например, xor).

В C ++ 11 существует std::tuple и std::tie позволяющая назначать несколько выражений без введения временных рядов (они будут введены за кулисами для хранения значений, хранящихся в кортеже, и попытаются оптимизировать их полностью или, по крайней мере, только с использованием регистров для их удержания, если это возможно):

 using std::tie; using std::make_tuple; tie(ones, twos) = make_tuple((ones ^ n) ^ ~twos, (ones & n) | (twos & ~n)); 

Обратите внимание, что типы пары / кортежей правой стороны должны соответствовать целевым значениям с левой стороны, поскольку здесь не подразумевается преобразование. Если вы столкнулись с проблемами, выполните static_cast с правой стороны, сообщите std::make_tuple о явных типах или просто используйте конструктор для std::tuple требующий явных типов, например:

 using std::tie; using std::tuple; tie(ones, twos) = tuple<int,int>((ones ^ n) ^ ~twos, (ones & n) | (twos & ~n)); 

Если x и y являются целыми числами, существуют различные быстрые трюки для их замены в одной строке:

http://cpptruths.blogspot.com/2006/04/swapping-two-integers-in-one-liner.html

  • Кросс-компиляция и упаковка
  • Развертывание модели регрессии caffe
  • Как установить среду, в которой фрагмент python может запускаться в c ++-программе?
  • Как создать общедоступную функцию cython, которая может принимать объект c ++ struct / instance или python в качестве параметра?
  • Создание связывания общего объекта Python с cmake, который зависит от внешних библиотек
  • C ++ Boost.Python: 2 проблемы
  • структура каталога для проекта, который смешивает C ++ и Python
  • Каков самый простой способ создания Python26.zip для встроенного дистрибутива?
  •  
    Interesting Posts for Van-Lav

    передача \ n (новая строка) в аргументе stdout throught sys

    Microsoft Speech Recognition Custom Training

    Как использовать данные в package_data из исходного кода?

    PIL декодер jpeg недоступен на ubuntu x64,

    Python writelines () и write () огромная разница во времени

    python "-" тире, показывающий как "\ xe2 \ x80 \ x94" – как исправить

    Использование pandas для выбора строк с использованием двух разных столбцов из dataframe?

    Python импортирует относительный путь

    Как проверить, является ли jpeg-изображение цветным или серым, используя только Python stdlib

    Пилинг: относительный импорт должен быть

    Я пытаюсь выбрать структуру для продукта, который я собираюсь построить, и до сих пор я склоняюсь к Нагаре … Любые мысли?

    Django Передача данных между представлениями

    «Большие данные» работают с использованием панд

    копировать файл, сохранять разрешения и владельца

    Запросить ввод из пользовательской команды django?

    Python - лучший язык программирования в мире.