2017-01-26 11 views
12

Aşağıdaki kod uyarınca std::tie() kullanarak iki değişkeni takas etmeye çalışıyordum (std::swap'un farkındayım, bunu meraktan kurtarmaya çalışıyordum)):{} ve std :: make_pair() işlevini kullanarak iki değişkeni takas etmeye çalışırken farklı bir davranış

#include <iostream> 
#include <tuple> 

using std::cin; using std::tie; 
using std::cout; using std::endl; 
using std::make_pair; 

int main() { 
    int a = 2, b = 10; 
    cout << "Before Swapping using {}" << endl; 
    cout << "a: " << a << " b: " << b < <endl; 
    tie(a, b) = {b, a}; 
    cout << "After Swapping using {}" << endl; 
    cout << "a: " << a << " b: " << b << endl; 

    a = 2, b = 10; 
    cout << "Before Swapping using make_pair()" << endl; 
    cout << "a: " << a << " b: " << b << endl; 
    tie(a, b) = make_pair(b, a); 
    cout << "After Swapping using make_pair()" << endl; 
    cout << "a: " << a << " b: " << b << endl;  

    return 0; 
} 

ben g++ test.cpp -std=c++11 -o test kullanarak derlenmiş.

Ama çıkış şuydu:

Before Swapping using {} 
a: 2 b: 10 
After Swapping using {} 
a: 10 b: 10 
Before Swapping using make_pair() 
a: 2 b: 10 
After Swapping using make_pair() 
a: 10 b: 2 

Yani, bunun yerine std::make_pair(a, b) her şey yazma {a, b} yazabilir beri benim soru, (C++ 11 sonrası), neden bu iki sürümü veriyoruz farklı çıkış?

Benim tahminim aşağıdaki satırı

std::tie(a, b) = {b, a}; 

bir çift yapma ve nedense sadece a değerini mutasyona olmadığını oldu. Ama emin değilim.

+0

tanımsız davranışa benziyor ... 'a'' b' değerine ayarlı ve daha sonra güncellenen 'a'' b' yazılıyor ... Bir sıra noktası sorunu. –

+0

@ Jarod42 aşağıdaki cevabı verir. {} Ile bir çift oluşturabilirsin, fakat derleyicinin o noktada ne yaptığınızı bilmesi gerektiğini bilmeniz doğru. –

cevap

5

{b, a}std::tuple<int&, int&> yapar, std::make_pairstd::pair<int, int> yapar.

std::pair<int&, int&> ile neler olduğunu düşünün. Esas olarak, değişkenlerden birini diğerine atamak ve sonra diğerini bir diğerine atamaktır. Bu, a = b; b = a; veya b = a; a = b; yapmasına eşdeğerdir.

+0

Bir "" çifti yapmaz, bu bir 'tuple yapar. – Barry

13

tie(a, b) = {b, a};

std::tuple<int&, int&> operator = (std::tuple<int&, int&>&&) kullanacaktır. ve beklediğiniz gibi std::tuple<int&, int&> operator = (std::tuple<int, int>&&).

std::tie(a, b)std::tuple<int&, int&>'dur.
std::tuple, birçok operator = sahiptir, ancak (yazmadan) {a, b} ile tek canlı kopyasını/taşıma atama vardır.

3

sadece make_tuple

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

o = bir aynı şey a = b veya b var kullanmak;

İlgili konular