我将部分代码从C#转换为C ++。
以下是我的观点:
Class Point
{
public int X;
public int Y;
}
const int MAX = 256;
public void ComputePoints(Byte[] image,
int width,
int height,
out List<Point>[] listPixels)
{
listPixels = new List<Point>[MAX];
//etc..
}
(我简化了这段代码只展示了有趣的部分)。
我的问题涉及out List<Point>[] listPixels
。我尝试通过以下方式进行翻译:
public void ComputePoints(unsigned char[] image,
int width,
int height,
std::vector<Point> *listPixels[])
{
*listPixels = new std::vector<Point>[MAX];
//etc..
}
但我有错误
分段错误。
如何在C ++中编写out List<Point>[] listPixels
最简单的等价物?
答案 0 :(得分:6)
由于List<Point>[]
是一个列表数组,您可以使用嵌套向量(向量向量)来获得所需的行为:
std::vector<std::vector<Point> >
请注意,在两个>
之间添加空格可能很重要。有些编译器不会在没有编译的情况下进行编译。
现在您可以将矢量作为参考传递,如
void ComputePoints(... , std::vector<std::vector<Point> > &listPixels)
{
...
答案 1 :(得分:1)
对于固定大小的数组,您可以使用std :: array。
你不需要在c ++中使用new,你可以简单地使用堆栈,这是从c#/ java转换到c ++时的常见问题。
对于简单对象,您几乎不需要动态分配它们(使用new),如果必须动态分配它们,请不要使用带有new的原始拥有指针,使用智能指针(std :: unique_ptr,std :: shared_ptr) 。 它不仅是在c ++中创建对象的方式,在堆栈上分配对象也比堆快,而且你有更好的局部性。
#include <list>
#incldue <array>
const int MAX = 256;
std::array<std::list<Point>, MAX> array_list;
我也想输入def这么长的类型:
using MyContainer = std::array<std::list<Point>, 256>;
MyContainer array_list;
would be one way to have a array of lists
如果你不一定需要一个列表,你也可以使用std :: vector(应该是你的默认容器),它提供更多的位置
对于前C ++ 11(你可以在其他答案中找到)你也可以使用std :: vector而不是std :: array,它将在堆上分配项目,但是这应该没问题,因为与普通C数组相比,std :: vector提供了更好的功能。
或者如果你真的想使用C数组: 只需堆叠:
std::list<Point> my_list_array[MAX];
和堆分配版本:
std::list<Point>* my_list_array = new std::list<Point>[MAX];
//but don't forget about the delete[]!
答案 2 :(得分:1)
为什么不按值返回向量矢量?在C ++ 11及更新版本中,它更快,代码更容易理解。
struct Point {
int x;
int y;
};
const int MAX = 256;
std::vector<std::vector<Point>> computePoints(const unsigned char image[], int width, int height) {
std::vector<std::vector<Point>> points(MAX);
// Here goes the code that does the calculations and fills 'points'.
return points;
}