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

C++11 通过引用传递从索引i开始的向量,c++11,pass-by-reference,C++11,Pass By Reference,我正在用C写一个函数++ int maxsubarray(vector<int>&nums) 我想通过考试 {3,4,5} 传递给函数,即从索引2开始传递向量。在C语言中,我知道我可以调用maxsubarray(v+2) 但是C++中没有用。我可以通过添加start index参数来修改该函数,使其正常工作。我只是想知道我能在不修改原始函数的情况下完成它吗? THX您必须使用要传递的零件创建一个临时向量: std::vector<int> v = {1,2

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

int maxsubarray(vector<int>&nums) 
我想通过考试

{3,4,5} 
传递给函数,即从索引2开始传递向量。在C语言中,我知道我可以调用maxsubarray(v+2) 但是C++中没有用。我可以通过添加start index参数来修改该函数,使其正常工作。我只是想知道我能在不修改原始函数的情况下完成它吗?
THX

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

std::vector<int> v = {1,2,3,4,5};
std::vector<int> v2(v.begin() + 2, v.end());
maxsubarray(v2);
std::vector v={1,2,3,4,5};
向量v2(v.begin()+2,v.end());
最大子阵(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]);
//复制向量
向量拷贝(v.begin()+2,v.end());
最大子阵列(拷贝);
//传递指向给定元素的指针
int最大子阵列(int*nums)
maxsubarray(&v[2]);

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

int myMax = maxsubarray(vector<int>(v.begin() + 2, v.end()));
int myMax=maxsubarray(向量(v.begin()+2,v.end());
这可能需要将函数签名更改为

int maxsubarray(const vector<int> &nums);
int-maxsubarray(常量向量和nums);

由于(我认为)临时变量不能绑定到非
常量
引用,但是如果
maxsubarray
不会修改
nums
的话,这种更改应该是首选的,显而易见的解决方案是创建一个新的向量并传递该向量。我绝对不建议这样做。最惯用的方法是让函数使用迭代器:

template<typename It>
It::value_type maxsubarray(It begin, It end) { ... }
模板
值\类型maxsubarray(它开始,它结束){…}
然后像这样使用它:

std::vector<int> nums(...);
auto max = maxsubarray(begin(nums) + 2, end(nums));
std::向量nums(…);
自动最大=最大子阵列(开始(nums)+2,结束(nums));
任何涉及拷贝的东西都是低效的,没有必要的

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