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

时间:2016-05-01 22:18:01

标签: c++11 pass-by-reference

我正在用C ++写一个函数

int maxsubarray(vector<int>&nums) 

说我有一个载体

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

我想传递

{3,4,5} 

到函数,即。从索引2开始传递向量。在C中我知道我可以调用maxsubarray(v + 2) 但在C ++中它不起作用。我可以通过添加start index参数来修改函数,以使其工作。只是想知道我可以不修改原来的功能吗? THX

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

然后像这样使用它:

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

其他任何涉及副本的内容效率低下且没必要。

答案 2 :(得分:0)

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

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

//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]);

答案 3 :(得分:0)

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

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

这可能需要将功能签名更改为

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

因为(我认为)temporaries不能绑定到非const个引用,但如果maxsubarray赢了,那么这个更改应该是首选修改nums