使用指向std :: vector的指针来访问C ++中的元素

时间:2017-09-28 17:34:35

标签: c++ function vector stl

我想传递一个函数std :: vector但我不想复制整个向量。我只想将地址传递给矢量。所以我尝试使用指针,我发现我不能使用括号来访问我想要的向量中的哪个元素。我怎么做?这来了我错误“ cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'

#include <iostream>
#include <vector>

using namespace std;

void f(vector<int>* x);

int main()
{
    vector<int>a;
    a.push_back(1);
    a.push_back(2);
    a.push_back(3);
    a.push_back(4);
    a.push_back(5);
    f(&a);
    return 0;
}

void f(vector<int>* x)
{
    int i;
    for(i=0;i<x->size();i++)
        cout<<x[i];
}

2 个答案:

答案 0 :(得分:3)

改变这个:

cout << x[i];

到此:

cout << (*x)[i];

甚至更好:

cout << x->at(i);

因为x是向量的指针

但你还不知道吗?我的意思是您使用的是x->size(),而不是x.size() ...

但是,为什么要传递指向函数的指针?引用会很好,并且可以让你的函数正文在你的问题中正常工作。因为你只是打印,一个const引用,会很好,就像这样:

void f(const vector<int>& x)
{
   // same body as in your question
}

与您的问题无关,但您的编译器应该为您的for循环生成此类警告:

warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type {aka long unsigned int}' [-Wsign-compare]
     for(i=0;i<x->size();i++)
             ~^~~~~~~~~~

通过将i声明为unsigned intsize_t来修复此问题。

答案 1 :(得分:0)

在这种情况下,您应该传递const引用,而不是原始指针:

void f(const vector<int> &x)
{
    int i;
    for(i=0;i<x.size();i++)
        cout<<x[i];
}

并在不接收地址的情况下调用它:

f(a);

这也可以消除代码中的另一个问题,在解除引用之前,您应该检查f()的{​​{1}}的传递指针。