假设我有这样的功能
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
之前,我只可以复制数据向量的一部分,然后将复制的向量通过引用传递给函数,但是我希望保持其签名不变。
是否有一种实现我想要的好方法?这样,该函数基本上会使用我提供给该函数的参数来调用向量的构造函数?
答案 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))