2008-11-08 80 views
6

Có cách nào để thực hiện phép gán song song trong C++ không? Hiện nay, biên dịch dưới đây (với lời cảnh báo)Phân công song song trong C++

#include <iostream> 

int main() { 
    int a = 4; 
    int b = 5; 
    a, b = b, a; 
    std::cout << "a: " << a << endl 
      << "b: " << b << endl; 

    return 0; 
} 

và in:

a: 4 
b: 5 

Những gì tôi muốn nó in ... nếu nó không được rõ ràng, là:

a: 5 
b: 4 

Như trong, nói, ruby ​​hoặc python.

Trả lời

16

Điều đó là không thể. Mã của bạn ví dụ

a, b = b, a; 

được hiểu theo cách sau:

a, (b = b), a 

Nó không có gì. Toán tử dấu phẩy làm cho nó trả về giá trị của một toán hạng (bên phải nhất). Bởi vì bài tập liên kết chặt chẽ hơn, b = b là parens.

Cách thích làm điều này chỉ là

std::swap(a, b); 

Boost bao gồm một lớp tuple mà bạn có thể làm

tie(a, b) = make_tuple(b, a); 

Nó nội bộ tạo ra một tuple tài liệu tham khảo để a và b, và sau đó được phân công cho họ một tuple của b và a.

1

Hoặc Perl. Nhưng không, đó là không thể (như xa như tôi biết), bạn cần phải sử dụng một biến tạm thời, như trong:

int a = 4; 
int b = 5; 

{ 
    int tmp = a; 
    a = b; 
    b = tmp; 
} 

FYI, trong nội bộ những ngôn ngữ (hoặc Perl ít nhất) tạo ra một danh sách tạm thời { a, b }, sau đó gán danh sách cho hai biến. Nói cách khác, điều này là ít nhất là biểu diễn, nếu chỉ có một chút lộn xộn hơn.

3

Phân bổ song song không được hỗ trợ trong C++. Các ngôn ngữ hỗ trợ điều này thường coi a,b,c là một danh sách ở hai bên của toán tử gán, đây không phải là cách toán tử dấu phẩy hoạt động trong C++. Trong C++, a, b đánh giá a và sau đó b, vì vậy a, b = b, a cũng giống như a; b = b; a;.

0

Hoặc Lua ...
Có các thủ thuật với C/C++, như sử dụng xor hoặc hoạt động, nhưng có nguy cơ tràn và như vậy. Chỉ cần làm điều đó một cách đau đớn, với ba bài tập. Không phải là một thỏa thuận lớn.

+0

có thể muốn đề cập đến thủ thuật xor cũng chỉ hoạt động trên các loại tích phân. Ngoài ra, quảng cáo số nguyên sẽ giữ cho nó không bị tràn nhưng hai cùng loại sẽ không tràn với một hoạt động xor 0b1110 xor 0b1010 sẽ luôn là 0b1100 ở đây là hoạt động bitwise – Beached

0

Không có chức năng nào như vậy trong Thư viện chuẩn. Bạn có thể viết một tập hợp các chức năng mẫu:

template <typename T1> void ParAssign(T1& Lhs_1, T1 const& Rhs1); 
template <typename T1, typename T2> void ParAssign(T1& Lhs1, T2& Lhs2, T1 const& Rhs1, T2 const& Rhs2); 
// etc. 
ParAssign(a,b, 
      b,a); 

Đó là không tầm thường nếu có răng cưa, như trong ví dụ trao đổi của bạn.

+0

std :: swap (a, b) – Beached

0

Câu hỏi này là rất cũ – Tôi chỉ cần stumbled vào nó hôm nay ...
... và tự hỏi tại sao không ai đưa ra câu trả lời này trước khi ...

Tôi nghĩ rằng, nó có thể làm điều đó trong C++ 11 tương tự như Python thực hiện nó (dưới mui xe):

#include <iostream> 
using namespace std; 

int main() 
{ 
    int a = 4, b = 5; 
    cout << "Before assignment: a: " << a << ", b: " << b << endl; 
    pair<int&, int&> ba(b, a); 
    ba = make_pair(a, b); // <===: (b, a) = (a, b) 
    cout << "After assignment : a: " << a << ", b: " << b << endl; 
    return 0; 
} 

Tôi cố gắng này trên ideone.com. Đầu ra là:

Before assignment: a: 4, b: 5 
After assignment : a: 5, b: 4 

Nếu tôi nhớ đúng (Tôi không phải là chuyên gia về Python), trong Python, a, b biểu thị một cặp. (Python Doc.: 5.3. Tuples and Sequences)

Cặp như vậy có thể được thực hiện trong C++ 11 dễ dàng, ví dụ: với std::pair. Trong trường hợp này, tôi đã tạo một cặp tham chiếu và gán cặp giá trị. Nó hoạt động như là make_pair() tải cả hai biến trước khi cặp bên phải (của các giá trị) được gán cho cặp tham chiếu bên trái.

Cuộn lại, tôi nhận thấy câu trả lời này gần với giải pháp dựa trên tăng của Johannes answer.

Có thể, lý do là nó không hoạt động trong C++ 03. Tôi đã thử trong coliru.stacked-crooked.com: Với -std=c++03 nó mang lại hiệu quả khủng khiếp khi đọc lỗi biên dịch – thay đổi thành -std=c++11 và nó biên dịch và thực hiện tốt như mô tả ở trên.

Disclaimer

Tôi chỉ không thể tưởng tượng những gì giải pháp này là tốt cho hay những gì thực tế giá trị của nó có thể có. Đây không phải là những gì tôi đã cố gắng làm. Như nhiều câu trả lời khác nói "Nó không hoạt động." IMHO nó (chính tả nó đúng theo ngôn ngữ C++) ...