在按值调用中转发构造函数参数(C ++)

时间:2018-10-09 11:58:30

标签: c++

假设我有这样的功能

    void foo(std::vector<int> data)

现在我想调用此函数,但是我拥有的向量很大,我只需要传递它的特定部分。显然,我想避免不必要的复制(虽然函数foo应该用它制作矢量的一个本地副本)。

我想实现以下目标:

    std::vector<int> largeVector(1e6); // some large data vector
    int nPointsToUse = 400; // only a small fraction of it is needed
    int offset = 2000;
    foo(largeVector.begin() + offset, largeVector.begin() + offset + nPointsToUse)

但这显然不起作用,因为foo期望一个参数是整数的向量。

在调用foo之前,我只可以复制数据向量的一部分,然后将复制的向量通过引用传递给函数,但是我希望保持其签名不变。

是否有一种实现我想要的好方法?这样,该函数基本上会使用我提供给该函数的参数来调用向量的构造函数?

2 个答案:

答案 0 :(得分:5)

Copy elision应该适用:

foo({largeVector.begin() + offset, largeVector.begin() + offset + nPointsToUse});

否则将foo更改为迭代器或范围(如std::span)。

答案 1 :(得分:0)

您不能避免至少复制一份vector的当前版本的foo

如果您拥有foo函数,并且对vector进行了只读操作,请将签名更改为void foo(const vector<int> & x)

如果您无法更改签名,则可以在呼叫方使用std::move以避免不必要的多余副本。

foo(std::move(newVectorSlice))