我正在用C ++写一个函数
int maxsubarray(vector<int>&nums)
说我有一个载体
v={1,2,3,4,5}
我想传递
{3,4,5}
到函数,即。从索引2开始传递向量。在C中我知道我可以调用maxsubarray(v + 2) 但在C ++中它不起作用。我可以通过添加start index参数来修改函数,以使其工作。只是想知道我可以不修改原来的功能吗? THX
答案 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
。