【问题标题】:Can't access vector on the heap无法访问堆上的向量
【发布时间】:2016-10-20 13:30:13
【问题描述】:

我在堆中有一个向量,但无法获取它的元素 - 它无法编译 - 给出 n 错误 'cannot bind 'std::basic ostream' 堆栈向量和简单数组工作正常。这里有什么问题?

#include <iostream>
#include <vector>

using namespace std;

int main()
{

    vector<int> * factors= new vector<int>(4);
    cout<<factors<<endl;
    cout<<(factors+1)<<endl;
    //cout<<factors[1]<<endl;

    factors->push_back(12);
    factors->push_back(232);
    factors->push_back(54);
    factors->push_back(42);

    //cout<<*factors; //error - cannot bind 'std::ostream..' lvalue to 'std::basic_ostream...'
   // cout<<factors[0]; // error

        //vector in stack
    vector<int> factors3(4);
    factors3.push_back(43);
    factors3.push_back(543);
    factors3.push_back(64);
    factors3.push_back(26);
    cout<<"factors3 "<<factors3[3]<<endl; //gives "0"
    cout<<"factors3 "<<factors3.at(3)<<endl; //gives "0"

    int * factors2=new int[10];
    factors2[0]=32;
    factors2[1]=35;
    factors2[2]=676;
    factors2[3]=123;
    cout<<factors2[0]<<endl; //it's OK
    cout<<factors2[1]<<endl;
    cout<<*factors2<<endl;

    cout << "Done" << endl;
    return 0;
}

【问题讨论】:

    标签: c++ arrays pointers vector stl


    【解决方案1】:
    cout<<(factors+1)<<endl;
    //cout<<factors[1]<<endl;
    

    应该是:

    cout << (*factors)[1] << endl;
    

    vector<int> factors3(4);
    factors3.push_back(43);
    factors3.push_back(543);
    factors3.push_back(64);
    factors3.push_back(26);
    cout<<"factors3 "<<factors3[3]<<endl; //gives "0"
    cout<<"factors3 "<<factors3.at(3)<<endl; //gives "0"
    

    因为你创建了一个包含 4 个元素的向量,然后再推 4 个元素,所以你最终会得到一个包含元素 0, 0, 0, 0, 43, 543, 64, 26 的向量

    【讨论】:

    • 谢谢。为什么在堆中的简单数组的情况下,数组的名称可以在没有*操作的括号中使用,而向量的名称不能?
    • 因为向量不是数组,并且您的指针包含一个向量,而不是向量数组。阅读 pointer arithmeticoperator [] 以了解它们的工作原理。
    【解决方案2】:

    让我们看看导致编译器错误的行。首先,这个:

    cout << *factors << endl;
    

    这里,factorsvector&lt;int&gt;*,所以 *factorsvector&lt;int&gt;。因此,此代码尝试将vector&lt;int&gt; 插入流中。您不能使用 &lt;&lt; 运算符在 C++ 中显示 vector&lt;int&gt;(它不带有重载的 &lt;&lt; 运算符),因此您在此处遇到的编译器错误意味着“我知道您在尝试使用&lt;&lt; 输出vector,但我不知道该怎么做。”

    那么,您可能想知道为什么要使用代码

    cout << *factors2 << endl;
    

    工作正常。在这种情况下,factors2 是一个int*,因此当您通过编写*factors2 取消引用factors2 时,您将得到一个实际的诚实整数,它确实可以打印出来。请注意,原始数组和 vectors 在这方面的工作方式不同 - 在 C++ 中,指向数组的指针只是指向数组第一个元素的指针,因此取消引用它们会产生指向第一个元素的指针,而指向 @987654338 的指针@ 与指向其第一个元素的指针相同。

    这也解释了为什么写作

    cout << factors[0] << endl;
    

    不起作用。请记住 - factors 是指向 vector 的指针,而 vector 不是数组。写factors[0] 的意思是“给我factors 指向的数组中的第一个vector”,而不是“给我factors 指向的vector 的第一个元素。如果这就是你想要做的,你可以写

    cout << (*factors)[0] << endl;
    

    这表示“取消引用 factors 以取回实际的 vector,然后查找其第零个元素。”

    至于你的第二个问题 - 你为什么没有看到你添加到向量中的数字? - 注意你通过写来声明向量

    vector<int> factors3(4); // <--- Notice the 4
    

    这里的(4) 的意思是“给我一个vector,初始化为有四个ints,所有这些都是零。”然后,当您使用push_back 时,您正在向vector 添加新元素,而不是替换现有元素。您可以通过直接写入向量元素来解决此问题:

    vector<int> factors3(4);
    factors3[0] = 43;
    factors3[1] = 543;
    factors3[2] = 64;
    factors3[3] = 26;
    

    或者不指定factors3的大小:

    vector<int> factors3; // <--- No 4!
    factors3.push_back(43);
    factors3.push_back(543);
    factors3.push_back(64);
    factors3.push_back(26);
    

    或者,如果你有一个现代编译器,通过像这样初始化向量:

    vector<int> factors3 = {43, 545, 64, 26};
    

    无论哪种方式,您都在混合和匹配两种不同的方法 - 每种方法都可以单独工作 - 但它们一起不会做你期望他们做的事情。

    总结一下:

    • 您可以取消引用指向数组的指针以获取指向第一个元素的指针,但这不适用于指向向量的指针。
    • 注意默认大小的向量然后使用push_back - 这是一个容易犯的错误。

    【讨论】:

    • 谢谢。现在一切都非常清楚了。但是如果我有一个整数向量的向量呢? vector&lt; vector&lt;int&gt; &gt; * pointer = new vector&lt; vector&lt;int&gt; &gt;() ?指针将指向外部向量,然后我们取消引用它,我们得到外部向量并获得 int,我们需要 (*pointer)[0][0],对吗?或者如果是vector&lt; &lt;vector&lt;int&gt;&gt; * &gt; * pointer2,int是(* (*pointer2)[0] )[0]
    • 如有疑问,请查看类型!如果pointer2vector&lt;vector&lt;int&gt;&gt;*,那么*pointer2vector&lt;vector&lt;int&gt;&gt;。如果你使用方括号从向量中选择一些东西,你会得到一些底层类型的东西。这意味着(*pointer2)[a]vector&lt;int&gt;,所以(*pointer2)[a][b] 将是int。使用这种方法,如果pointer2vector&lt;vector&lt;int*&gt;*&gt;*,您将如何选择?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多