通过引用传递从索引 i 开始的向量

Pass a vector starting from index i by reference

我正在用 C++ 编写函数

int maxsubarray(vector<int>&nums) 

假设我有一个向量

v={1,2,3,4,5}

我想通过

{3,4,5} 

函数,即传递从索引 2 开始的向量。在 C 中我知道我可以调用 maxsubarray(v+2) 但在 C++ 中它不起作用。当然,我可以通过添加起始​​索引参数来修改函数,使其正常工作。只是想知道我可以在不修改我原来的功能的情况下做到这一点吗? 谢谢

您必须使用要传递的部分创建一个临时向量:

std::vector<int> v = {1,2,3,4,5};
std::vector<int> v2(v.begin() + 2, v.end());
maxsubarray(v2);

不是没有构建另一个向量。

您可以构建一个新向量并通过引用函数传递它(但从性能的角度来看这可能并不理想。您通常通过引用传递以避免不必要的复制)或使用指针:

//copy the vector
std::vector<int> copy(v.begin()+2, v.end());
maxsubarray(copy);

//pass a pointer to the given element
int maxsubarray(int * nums) 
maxsubarray(&v[2]);

您可以尝试使用临时调用它:

int myMax = maxsubarray(vector<int>(v.begin() + 2, v.end()));

这可能需要将函数签名更改为

int maxsubarray(const vector<int> &nums);

因为(我认为)临时对象不能绑定到非 const 引用,但如果 maxsubarray 不会,那么这里应该 首选 更改' t 修改 nums.

显而易见的解决方案是创建一个新向量并传递那个向量。我绝对不推荐这样做。最惯用的方法是让你的函数接受迭代器:

template<typename It>
It::value_type maxsubarray(It begin, It end) { ... }

然后像这样使用它:

std::vector<int> nums(...);
auto max = maxsubarray(begin(nums) + 2, end(nums));

任何其他涉及副本的事情都是低效且没有必要的。