将指针向量传递给函数

时间:2014-08-15 19:46:50

标签: c++ pointers vector

我遗漏了一个我无法在网上找到的简单参考print_vector函数需要第二个参数(指针向量)。

#include <iostream>
#include <vector>

using namespace std;

void print_vector(ostream& os, vector<int>*);

int main()
{

int b =100;

vector<int>* a = new vector<int>;

for(int z=0; z< a->size() ; z++)
{

    a-> at(z)= b;
    b++;
}


print_vector(cout,  a);

delete a;

return 0;
}


void print_vector(ostream& os, vector<int> a)
{
for(int c =0; c <= a.size(); c++)
{
     os << a[c] << endl;
}


}

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

最简单的方法是使用引用,但您可以尝试两种方法:

using namespace std;
void print_vector(ostream& os, const vector<int>& aVec);
void print_vector(ostream& os, const vector<int>* aVec);
int main()
{
    int b = 100;
    vector<int> a;
    for(int z=0; z < b; z++)
        a.push_back(z);
    print_vector(cout,  a);
    print_vector(cout,  &a);
    return 0;
}
void print_vector(ostream& os, const vector<int> &a)
{
    for(int c=0; c < a.size(); c++)
        os << a[c] << endl;
}
void print_vector(ostream& os, const vector<int> *a)
{
    for(int c=0; c < a->size(); c++)
        os << (*a)[c] << endl;
}

upd:thx到juanchopanza使用const引用的建议

答案 1 :(得分:1)

首先,您不清楚在此代码段中尝试执行的操作

int b =100;

vector<int>* a = new vector<int>;

for(int z=0; z< a->size() ; z++)
{

    a-> at(z)= b;
    b++;
}

由于分配的向量为空,因此循环将永远不会迭代。

至于函数,那么你应该交换参数:第一个参数应该引用一个向量。

例如

void print_vector( const std::vector<int> &v, std::ostream &os = std::cout )
{
   for ( int x : v ) os << x << std::endl;
}

程序看起来像

#include <iostream>
#include <vector>

void print_vector( const std::vector<int> &v, std::ostream &os = std::cout )
{
   for ( int x : v ) os << x << std::endl;
}


int main()
{
    const int N = 100;

    std::vector<int> v;
    v.reserve( N );

    for ( int  i = 0; i < N; i++ )
    {
        v.push_back( i );
    }


    print_vector( v );


    return 0;
}

如果确实需要使用指向矢量的指针,那么代码可能看起来像

#include <iostream>
#include <vector>

void print_vector( const std::vector<int> &v, std::ostream &os = std::cout )
{
   for ( int x : v ) os << x << std::endl;
}


int main()
{
    const int N = 10;
    const int INITIAL = 100;

    std::vector<int> *v = new std::vector<int>;
    v->reserve( N );

    for ( int  i = 0; i < N; i++ )
    {
        v->push_back( INITIAL + i );
    }


    print_vector( *v );

    delete v;

    return 0;
}

答案 2 :(得分:0)

首先,我们假设您不想更改print_vector功能签名。如果不想弄清楚你的程序应该完成什么,这应该编译:

#include <fstream>
#include <vector>
#include <iostream>

using namespace std;
void print_vector(ostream& os, vector<int>*);

int main()
{
    int b =100;
    vector<int> a;
    for(int z=0; z< a.size() ; z++)
    {
        a.at(z)= b;
        b++;
    }
    print_vector(cout,  &a);
    return 0;
}


void print_vector(ostream& os, vector<int>* a)
{
    for(size_t c =0; c < a->size(); c++)
        os << (*a)[c] << endl;
}

以下是更改:

  1. print_vector函数接受指针。这意味着该函数需要address-of现有向量。注意在main()函数中,向量是一个对象,我所做的就是传递地址(不需要new)。有关要求指针作为参数的函数的信息,请参阅此答案:Beginner C++ uninitialized local variable

  2. print_vector功能的循环已从<=更改为<。如果没有,你就会走出界限,导致未定义的行为。

  3. print_vector中注意,当传递指针时,operator []需要以不同的方式处理。在应用operator []之前,指针被取消引用。另一种语法是a->operator[](c),但这有点冗长。