C ++如何实现列表数组

时间:2017-10-17 13:39:24

标签: c# c++

我将部分代码从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最简单的等价物?

3 个答案:

答案 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;
}