如何将向量传递给函数参数(我需要指针吗?)

问题描述 投票:-3回答:3

当我们将向量传递给函数时,为什么不能像数组那样做呢?

例如:

#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;
}

就像数组一样,为什么这不可能呢?

c++ pointers vector
3个回答
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;
}

2
投票

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);
}

1
投票

在此函数调用中

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
© www.soinside.com 2019 - 2024. All rights reserved.