[英]How to pass a vector into a function parameter (do I need pointers?)
当我们将一个向量传递给一个函数时,为什么我们不能像数组那样做呢?
例如:
#include<bits/stdc++.h>
using namespace std;
void func(vector<int> vect)
{
vect.push_back(30);
}
int main()
{
vector<int> vect;
vect.push_back(10);
vect.push_back(20);
func(vect);
for (int i = 0; i<vect.size(); i++)
cout << vect[i] << " ";
return 0;
}
在这个例子中,它工作正常。 但是如果我这样做,为什么它不像数组那样工作?
#include<bits/stdc++.h>
using namespace std;
void func(vector<int> *vect)
{
vect.push_back(30);
}
int main()
{
vector<int> vect;
vect.push_back(10);
vect.push_back(20);
func(&vect[0]);
for (int i = 0; i<vect.size(); i++)
cout << vect[i] << " ";
return 0;
}
就像数组一样,为什么这不可能?
vect[0]
命名为int
,而不是std::vector<int>
。
&vect[0]
是一个int *
,而不是一个std::vector<int> *
。 你不能调用一个需要std::vector<int> *
和int *
的函数
你需要学习参考。
void func(vector<int> & vect) // use an existing std::vector<int>
{
vect.push_back(30);
}
在这个函数调用中
func(&vect[0]);
参数表达式的类型为int *
而函数参数的类型为std::vector<int> *
void func(vector<int> *vect)
并且没有从一种类型到另一种类型的隐式转换。
本质上,std::vector 类型的对象已经是一个包含在类中的指针。 因此,通过引用传递 std::vector 类型的对象实际上是同时传递了一个指向向量内部指向的已分配数组的指针。
请注意在您的问题中提供的第一个程序中,您正在按值传递向量 vect。
void func(vector<int> vect)
{
vect.push_back(30);
}
所以函数不会改变传递给函数的原始对象。 如果要更改原始对象,则函数参数应具有引用类型,例如
void func(vector<int> &vect)
{
vect.push_back(30);
}
在 C++ 17 中为标准类std::string
做了类似的事情。它是类std::string_view
。 您可以像处理数组一样传递指向 std::string 类型对象的第一个元素的指针。 但是您还需要传递指针指向的字符数组的长度。
这是一个演示程序。
#include <iostream>
#include <string>
#include <string_view>
void func( std::string_view s )
{
std::string reversed_string( s.rbegin(), s .rend() );
std::cout << reversed_string << '\n';
}
int main()
{
std::string s( "Hello" );
func( { &s[0], s.size() } );
}
它的输出是
olleH
很有可能,但是您传递的是向量的元素,而不是向量本身:
void func(vector<int> *vect) {
vect->push_back(30); // <-- pointer type expression
}
int main() {
vector<int> vect;
vect.push_back(10);
vect.push_back(20);
func(&vect); // <-- pass the vector
for (size_t i = 0; i < vect.size(); i++) // <-- iterator should be size_t type
cout << vect[i] << " ";
return 0;
}
如果您想传递对向量元素的引用,您也可以这样做,请注意,该元素必须已经存在:
void func(int *vect_elem) { //<-- pointer to int parameter
*vect_elem = 30; // <-- assign 30 to the vector element
}
int main() {
vector<int> vect;
vect.push_back(10);
vect.push_back(20);
func(&vect[0]); //<-- reference an existing element of the vector
for (size_t i = 0; i<vect.size(); i++)
cout << vect[i] << " ";
return 0;
}
在这种特殊情况下,您不需要指针,更好的选择是仅使用引用,就像已经提到的那样,因为您不需要任何取消引用:
void func(vector<int> &vect) { //<-- parameter reference
vect.push_back(30);
}
int main() {
vector<int> vect;
vect.push_back(10);
vect.push_back(20);
func(vect); // <-- pass the vector
for (size_t i = 0; i < vect.size(); i++)
cout << vect[i] << " ";
return 0;
}
void func(int &vect_elem) { //<-- parameter reference
vect_elem = 30;
}
int main() {
vector<int> vect;
vect.push_back(10);
vect.push_back(20);
func(vect[0]); //<-- pass the element
for (size_t i = 0; i<vect.size(); i++)
cout << vect[i] << " ";
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.