İki çifte değişken döndürmek istiyorum: oluşturduğum bir işlevi çağırırken. Bazı öğreticilere göre (C++ 'nın temelleri ile ilgilenen), bunu yapamayacağım.Bir C++ işlevinde iki değişken döndürme
Bunu yapmanın bir yolu var mı?
İki çifte değişken döndürmek istiyorum: oluşturduğum bir işlevi çağırırken. Bazı öğreticilere göre (C++ 'nın temelleri ile ilgilenen), bunu yapamayacağım.Bir C++ işlevinde iki değişken döndürme
Bunu yapmanın bir yolu var mı?
Sen örneğin bir std::pair
kullanabilirsiniz
void setTwoDoubles(double& d1, double& d2)
{
d1 = 1.0;
d2 = 2.0;
}
double d1, d2;
setTwoDoubles(d1, d2);
std::cout << "d1=" << d1 << ", d2=" << d2 << std::endl
işlevi içinde değerlerini ayarlayarak bir fonksiyonun içine iki çift başvurular geçebilir.
Bkz: std::tuple
sayfasından alınan
Örnek I bağlantılı doğrudan iki değişkene. –
İki işlevi bir işlevden döndüremezsiniz, ancak bir işaretçiyi bir diziye veya iki çiftli içeren başka bir yapıya geri döndürebilirsiniz.
Sen değişkenleri tutan basit bir yapı yazıp iade veya std::pair
veya std::tuple
kullanabilirsiniz:
#include <utility>
std::pair<double, double> foo()
{
return std::make_pair(42., 3.14);
}
#include <iostream>
#include <tuple> // C++11, for std::tie
int main()
{
std::pair<double, double> p = foo();
std::cout << p.first << ", " << p.second << std::endl;
// C++11: use std::tie to unpack into pre-existing variables
double x, y;
std::tie(x,y) = foo();
std::cout << x << ", " << y << std::endl;
// C++17: structured bindings
auto [xx, yy] = foo(); // xx, yy are double
}
Ayrıca, iki ayrı geri dönüşü yakalamak için kullanılabilen ['std :: tie'] (http://en.cppreference.com/w/cpp/utility/tuple/tie) 'den de bahsetmek isteyebilirsiniz. mevcut değişkenler. –
@BenjaminLindley İyi öneri.Bir örnek eklendi. – juanchopanza
Teknik olarak, bir şekilde iki değişken dönmek mümkün değildir hayır dönüş zamanki bir değişken. Bununla birlikte, referansları kullanabilirsiniz. Bu şekilde, bir işleve birden çok değişken iletebilirsiniz ve fonksiyon yerine bir şey dönen yerine, onları atar:
void function(double & param1, double & param2) {
param1 = 6.28;
param2 = 3.14;
}
Ve bunu şöyle çağırır:
double var1, var2;
function(var1, var2);
Yapamazsın Doğrudan yapın (çünkü bir dönüş değeri tekildir).
Ancak, bir yapıya birkaç değer koyabilir ve bunu (<> çifti gibi) döndürebilirsiniz.
ortak bir model, referans ile çıkış değişkenleri döndürmektir:
ReturnVal Myfunction(/*in*/ BlahType _someParameters, /*out*/ ReturnType& _firstReturn, /*out*/ OtherReturnType& _secondReturn)
{
_firstReturn = //someStuff
_secondReturn = //someOtherStuff
return SUCCESS;
}
Hayır çıkış 100 olacak
#include <iostream>
using namespace std;
// function declaration
void swap(int &x, int &y);
int main()
{
// local variable declaration:
int a = 100;
int b = 200;
cout << "Before swap, value of a :" << a << endl;
cout << "Before swap, value of b :" << b << endl;
/* calling a function to swap the values using variable reference.*/
swap(a, b);
cout << "After swap, value of a :" << a << endl;
cout << "After swap, value of b :" << b << endl;
return 0;
}
// function definition to swap the values.
void swap(int &x, int &y)
{
int temp;
temp = x; /* save the value at address x */
x = y; /* put y into x */
y = temp; /* put x into y */
return;
}
olarak referans yöntemiyle kullanmak için gereken iki değişken döndüremez takas işlevini çağırmadan önce // x200 // y takas işlevini çağırmadan önce 200 // x takas işlevini çağırdıktan sonra 100 // y takas işlevini çağırdıktan sonra
bu dönüş olarak iki değer
C++ 11 kullanıyorsanız, ben ideal yolu std::tuple
ve std::tie
kullanmaktır söyleyebilirim.
#include <tuple>
#include <iostream>
#include <string>
#include <stdexcept>
std::tuple<double, char, std::string> get_student(int id)
{
if (id == 0) return std::make_tuple(3.8, 'A', "Lisa Simpson");
if (id == 1) return std::make_tuple(2.9, 'C', "Milhouse Van Houten");
if (id == 2) return std::make_tuple(1.7, 'D', "Ralph Wiggum");
throw std::invalid_argument("id");
}
int main()
{
auto student0 = get_student(0);
std::cout << "ID: 0, "
<< "GPA: " << std::get<0>(student0) << ", "
<< "grade: " << std::get<1>(student0) << ", "
<< "name: " << std::get<2>(student0) << '\n';
double gpa1;
char grade1;
std::string name1;
std::tie(gpa1, grade1, name1) = get_student(1);
std::cout << "ID: 1, "
<< "GPA: " << gpa1 << ", "
<< "grade: " << grade1 << ", "
<< "name: " << name1 << '\n';
}
Sonra C++ 11'de Eğer 'tie' kullanabilirsiniz http://stackoverflow.com/q/321068/10077 atamak –