【问题标题】:Using a pointer to a std::vector to access elements in C++ [duplicate]使用指向 std::vector 的指针访问 C++ 中的元素 [重复]
【发布时间】:2017-09-28 17:34:35
【问题描述】:

我想将 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];
}

【问题讨论】:

  • 我想将 std::vector 传递给函数,但我不想复制整个向量然后你想使用引用,而不是指针。它使这个问题消失了。
  • 您可以使用x-&gt;at(i)。但正如@NathanOliver 所说,使用参考更好。
  • 或“cout
  • x 是指向 vector&lt;int&gt; 的指针。因此,x[i] 给你一个vector&lt;int&gt;,而不仅仅是一个普通的int。您不能使用指针以与对象本身完全相同的方式访问某些内容。毕竟,这就是指针的含义。这不是同一个对象。它是一个指向对象的指针。
  • 我得到一个完全不同的错误。

标签: c++ function vector stl


【解决方案1】:

改变这个:

cout << x[i];

到这里:

cout << (*x)[i];

甚至更好:

cout << x->at(i);

因为x 是一个指向向量的指针

但你不知道吗?我的意思是你使用了x-&gt;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 来修复它。

【讨论】:

  • atoperator[] 并不完全相同。对于std::vectorat 方法会进行边界检查。对于其他容器,例如std::map,这种区别更为显着,其中atoperator[] 并不总是可以互换的。一种是const,另一种是在未找到时构造值。
  • 确实@FrançoisAndrieux,感谢您的评论。您是否建议我以某种方式修改我的答案?如果是,怎么做?
  • x-&gt;at(i); 是一个清晰的建议。但是由于前两个示例的行为相同,因此使用x-&gt;operator[](i); 将与其他示例更加一致。现在,更重要的是澄清还是一致性取决于您。我个人认为不需要任何改变。
【解决方案2】:

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

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

并在没有地址的情况下调用它:

f(a);

这也将消除您代码中的另一个问题,您应该在取消引用之前检查传递给f() 的指针是否有nullptr

【讨论】:

    猜你喜欢
    • 2011-03-18
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 2023-02-16
    • 2021-02-17
    相关资源
    最近更新 更多