当我们将向量传递给函数时,为什么不能像数组那样做呢?
例如:
#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;
}
就像数组一样,为什么这不可能呢?
这很有可能,但是您正在传递向量的一个元素,而不是向量本身:
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;
}
[如果您想传递对vector元素的引用,请注意,该元素必须已经存在:
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;
}
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