【发布时间】:2011-06-18 08:12:54
【问题描述】:
我想从一个 c++ 函数返回 3 个变量,但由于一个函数只能有一个运行返回值,我如何返回 3 个值。尝试使用 return(5,4);但这是一个语法错误。
【问题讨论】:
标签: c++
我想从一个 c++ 函数返回 3 个变量,但由于一个函数只能有一个运行返回值,我如何返回 3 个值。尝试使用 return(5,4);但这是一个语法错误。
【问题讨论】:
标签: c++
C++ 函数只能返回一个值。但是,您可以通过将它们包装在一个类或结构中来返回多个值。
struct Foo
{
int value1;
int value2;
};
Foo SomeFunction()
{
Foo result = { 5, 4 };
return result;
}
或者你可以使用std::tuple,如果你的编译器支持的话。
#include <tuple>
std::tuple<int, int, int> SomeFunction()
{
return std::make_tuple(5, 4, 3);
}
如果您事先不知道要返回多少个值,最好使用std::vector 或类似的容器。
您还可以通过为函数提供指针或引用参数并在函数中修改它们来返回多个值,但我认为返回复合类型通常是一种“更简洁”的方法。
【讨论】:
std::tiestackoverflow.com/a/2573822/502144
main() 函数,您将如何打印它?auto tup= swap(a,b); std::cout << tup << std::endl;,我收到error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’ 错误。有什么建议
在 C++ 中只能返回一个值。如果您需要返回更多信息,请返回一个结构(或像 std::vector 这样的容器),或者将一些变量作为非常量引用(或指针)传递并更改它们。
【讨论】:
尝试使用 return(5,4);但这是一个语法错误。
这不是语法错误。 (5,4) 是一个有效的表达式,这里 , 是一个运算符。所以表达式(5,4) 的计算结果是最右边的操作数,即4。因此它将返回4。
现在来解决您的问题:如果现有的任何一个对您没有帮助,请定义一个 struct,并返回一个 struct 的对象,如下所示:
struct values
{
int i;
int j;
char *other;
};
values f()
{
values v = {/*....*/};
//...
return v;
}
如果所有值的类型相同,那么你可以使用std::vector作为:
#include <vector> //must include it!
std::vector<int> f()
{
std::vector<int> v;
v.push_back(5);
v.push_back(4);
//so on
//...
return v;
}
还有其他容器,即。 std::map、std::list、std::stack 等。使用最适合您的。还有std::pair,顾名思义,它只包含两个值。
【讨论】:
或者您可以使用std::pair 获得两个结果,并查看boost::tuple 获得两个以上的结果。它甚至可以处理同一个元组中的不同类型。
【讨论】:
pair<pair<A, B>, C>模拟triple<A, B, C> :-)
有几种方法可以实现这一目标。
如果您有相同类型的对象,std::array 将是一个很好的返回类型。
如果您有不同的数字,请改用std::vector。
如果你有(固定数量的)不同类型,请使用std::tuple:
std::tuple <int, long, double> f()
{
return std::tuple <int, long, double>( 42, 4711l, 3.141 );
}
我不知道如何返回语言或标准库中内置的不同类型的不同数量的非多态对象。
【讨论】:
4711 而不是 4711l 呢?
不,但有两种方法可以做到这一点:
1) 将指向要“返回”的值的指针作为参数,您可以在函数中更改它的值。
2) 您可以创建一个包含所有这些值的struct 并返回结构。仅在确实需要时才使用它,但第一种解决方案要好得多。
【讨论】:
这里的大多数答案都是正确的,您应该返回一个结构。 如果您有兴趣,还有另一种方法,那就是发送您想要返回的变量的引用。
例如:
#include<iostream>
#include<cstdio>
using namespace std;
bool f(int a,int b,int& q,int& r)
{
if(b==0)return 0;
q=a/b;
r=a%b;
return 1;
}
int main()
{
int a=64,b=7,q,r;
bool pos=f(a,b,q,r);
if(pos)
{
printf("Quotient = %d Remainder = %d\n",q,r);
}
else
{
printf("Divison by zero not possible!\n");
}
return 0;
}
【讨论】:
return (a, b, c, ... , n) 语句 a、b、c 用逗号分隔,表达式计算为最右边的操作数 n。所以语法是正确的,但是不会返回多个值。
返回多个值:
【讨论】:
在这种情况下,您必须使用指针才能从函数返回多个值。这也可以通过使用指针参数指针参数保持它们的值' 返回多个值的指针的详细用法在http://www.techyv.com/questions/how-do-i-return-multiple-variables-c-function
【讨论】:
返回一个结构。
struct a
{
int x;
int y;
int z;
};
b()
{
a.x = 2;
a.y = 4;
a.z = 8;
return a;
}
【讨论】:
你不能。但是,您可以使用技巧来伪造它。例如,让你的函数返回一个指向 int 的指针,并返回指向一个 int 数组的指针。
【讨论】: