是否更好地返回vector <int>或int *?

时间:2016-09-21 10:26:03

标签: c++ pointers vector

我有一个应该返回一些整数的方法。那些整数将在构造函数之后使用。由于我对指针不太满意,所以我决定使用向量作为我的返回类型,以便稍后在myObject的构造函数中我可以使用myVector [i]来访问不同的int。

但是我的同事说在这种情况下int *作为返回类型更好,因为“如果要返回一个容器,那么你最好返回一个myObject类型并直接在方法中实例化它。”

所以看起来在这种情况下使用指针更好。这是真的吗?然后呢?

编辑:好的,我会在这里详细介绍一下。

这是我的类有三个int属性:

class MyClass{

public:
MyClass(int x, int y, int s);

private:
int coord_x;
int coord_y;
int size;
}

在另一个.cpp文件中,我有一个这样的方法:

// FileWithMethod.cpp
vector<int> myMethod(){

// some code here
return my_vector;
}

my_vector有3个int并且总是会因为它的元素将用于在第二个.cpp文件中实例化MyClass对象。

这里讨论的是myMethod()的返回类型是int还是vector。我的同事提出了一个int *,因为“实现这种结构是没用的(即一个返回稍后将在构造函数中使用的参数的方法)”。他为什么这么说,我不知道。他说如果我们使用指针但是如果我们使用容器那么这个结构很有意思,那么最好直接返回用3 int实例化的MyClass对象。所以他似乎明显反对vector的概念,可能是在内存分配/管理方面,并且更喜欢对MyClass对象使用int *。

在这里,我认为C ++的主要资产是摆脱棘手的指针,只有在没有其他选择或性能差异不可忽略的情况下才能使用它们。

我希望这更能说明情况。对于模糊的解释很抱歉。我很难估计当你处理问题时所提供的细节数量是否足以理解问题并且没有外部观点:)。

感谢您的回答,他们已经非常有帮助了!

3 个答案:

答案 0 :(得分:1)

由于您总是准确地返回3 int s,这是一个足够小的数字,请考虑使用std::array<int, 3>

它可能是最有效的,当然也是最受限制的标准类型。

答案 1 :(得分:0)

从您同事的引言中我假设他建议您返回您想要实例化的对象,而不是vector,而不是int*。这意味着如果此返回值的唯一目的是作为另一个对象的构造函数的输入,为什么不在此函数中构造对象并跳过临时结构。

在你的例子中,它将是:

MyClass myMethod(){    
    // some code here
    return MyClass{ /* my_vector values */ };
}

那就是说,返回指向数组的指针(我假设你的意思是int*)可能不是一个好主意,因为你必须跟踪谁应该delete以后(在MyClass建造之后)。在这方面,标准容器是优选的。

如果您不想使用vector,因为它对性能影响较小(您应该考虑与IMO一起生活)并且无法在方法中实例化目标类,可能还有另一种方法。我会使用tuple<int, int, int>作为返回值。它比原始的c-like阵列更轻巧,更易于使用。例如,如果参数的数量在将来发生变化,则维护起来并不容易。

答案 2 :(得分:0)

AFAIK,从方法或函数返回标准容器很好。除非您已经知道它将是一个非常集中使用的功能,需要进行低级别优化,否则在早期开发阶段拒绝这一功能在我看来是优化前的。

正如@LightnessRacesinOrbit在评论中所解释的那样,由于数据的动态分配和初始化,使用向量会增加一些开销。如果你真的需要这样的低级优化,我会在调用者中声明3个变量并通过引用传递它们。这样你就没有返回悬空指针的风险,没有线程安全问题(如果使用静态数组来避免悬空指针问题,可能会出现)并且没有不必要的动态分配。只需使用:

void myMethod(int& x, int& y, int& s) {
    ...
}

恕我直言,直接返回MyClass对象可能(取决于一般设计)在模块之间添加不需要的依赖。