通过引用传递从索引 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));
任何其他涉及副本的事情都是低效且没有必要的。
我正在用 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));
任何其他涉及副本的事情都是低效且没有必要的。