基本上我想做这样的事情:
int[3] array_func()
{
return {1,1,1};
}
int main(int argc,char * argv[])
{
int[3] point=array_func();
}
但在C++中似乎不合法。我知道可以使用向量,但由于我知道数组的大小是常量,所以似乎很可能会出现性能损失。
如果可能的话,我也想避免使用new
,因为在堆栈上分配东西更容易,也有可能提高性能。
这里的解决方案是什么?
基本上我想做这样的事情:
int[3] array_func()
{
return {1,1,1};
}
int main(int argc,char * argv[])
{
int[3] point=array_func();
}
但在C++中似乎不合法。我知道可以使用向量,但由于我知道数组的大小是常量,所以似乎很可能会出现性能损失。
如果可能的话,我也想避免使用new
,因为在堆栈上分配东西更容易,也有可能提高性能。
这里的解决方案是什么?
使用 C++0x,即将正式发布的新 C++ 标准(已经实现在最新的 gcc 和 msvc 中,如果我没记错的话),你可以按照你想要的方式来完成任务!只需要使用 std::array 而不是 int[3]。
std::array<int, 3> array_func()
{
return {1,1,1};
}
int main(int argc,char * argv[])
{
std::array<int, 3> point = array_func();
}
将数组放入结构体中。boost::array
就是这样一个工具包:
boost::array<int, 3> array_func() {
boost::array<int, 3> a = {{ 1, 1, 1 }};
return a;
}
int main() {
boost::array<int, 3> b = array_func();
}
简单粗暴:
template<typename E, size_t S>
struct my_array {
E data[S];
};
注意你可以使用聚合初始化语法。
sed, boost, std
而不需要 "一个简单的结构体" 吗?太好了,我们已经到了2011年!有时调用“臃肿的boost”(我猜)最终可能会比重新发明轮子更少地产生冗余。 - Johannes Schaub - litb你可以将它包装在一个 struct
中,使其能够通过值进行返回:
struct Vec3
{
float x[3];
}
Vec3 array_func()
{
Vec3 x = { 1.f, 1.f, 1.f };
return x;
}
我认为你不能直接在返回语句中使用数组初始化语法。当然,你可以引入一个构造函数(毕竟结构体只是所有成员都是公共的类):
struct Vec3
{
Vec3(a, b, c)
{
x[0] = a;
x[1] = b;
x[2] = c;
}
float x[3];
}
Vec3 array_func()
{
return Vec3(1.f, 1.f, 1.f);
}
std::tr1::array
(C++03或TR1),甚至是std::array
(C++1x),它们和boost提供的完全相同。(这表明boost不仅仅是另一个库。它是下一代C++标准的试验场,由std委员会成员创立,出于这个原因它具有非常高的质量标准和严格的审核流程,并为下一代标准库做出了大量贡献。) - sbistd::array
。现在,我肯定会使用它。(然而,正如我所说,它是从boost中出来的。) - sbi在C++中,您无法返回固定大小的数组。您可以返回指向int的指针(它将被用作数组),但这需要使用new
在堆上分配数组。
不过,您可以将您的数组作为参数传递给函数:
void array_func( int result[3])
{
result[0] = 1;
result[1] = 1;
result[2] = 1;
}
int main(int argc,char * argv[])
{
int point[3];
array_func( point );
}
3
不是被忽略了吗? - sbiint result[3]
“衰变”为int *result
(通常甚至不会发出警告)。如果你问我,这有点狡猾的编译器 ;) - j_random_hacker