【问题标题】:Vector pointing at Vectors指向向量的向量
【发布时间】:2019-06-02 16:02:20
【问题描述】:

我正在尝试实现一个指向其他向量的向量,而不是通过使用索引来提取第二个向量的值。例如,我想通过第一个向量索引一个向量的 3 值;

我得到一些超出范围的矢量索引,我不明白为什么。 这是代码。

#include<iostream>
#include<map>

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
    using namespace std;


    int main() {
        int n = 2;



            vector <vector<int>*> vec1;

            for (int i = 0; i < n; i++) 
            {
                vector<int> vec;
                vec.clear();
                cout << "Enter number of var : ";
                int var;
                cin >> var;
                for (int i = 0; i < var; i++)
                {
                    cout << "Enter number : ";
                    int num ;
                    cin >> num;
                    vec.push_back(num);
                }
                vec1.push_back(&vec);
                cout << "Container ends \n";
            }
            cout << "Enter i : ";
            int i;
            cin >> i;
            cout << "Enter j : ";
            int j;
            cin >> j;
            auto newvec = vec1[i];
            cout << newvec->at(j);
            system("pause");


        return 0;
    }

我实际上做的是这个。但我不知道这是否是一个好方法。我在堆中分配向量。

#include<iostream>
#include<map>

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
    using namespace std;


    int main() {
        int n = 2;



            vector <vector<int>*> vec1;

            for (int i = 0; i < n; i++) 
            {
                vector<int> *vec = new vector<int>;
                vec->clear();
                cout << "Enter number of var : ";
                int var;
                cin >> var;
                for (int i = 0; i < var; i++)
                {
                    cout << "Enter number : ";
                    int num ;
                    cin >> num;
                    vec->push_back(num);
                }
                vec1.push_back(vec);
                cout << "Container ends \n";
            }
            cout << "Enter i : ";
            int i;
            cin >> i;
            cout << "Enter j : ";
            int j;
            cin >> j;
            auto newvec = vec1[i];
            cout << newvec->at(j) << endl;;
            system("pause");


        return 0;
    }

【问题讨论】:

  • 您保留指向已被销毁的vector 的指针(在您的for 中创建和销毁)。
  • @Stephen Newell 你说得对,我只是播种。但我仍然想不出一种方法来做我想做的帽子
  • vector&lt;int&gt; vec;for() 循环范围内。在for() 循环完成后,所有引用地址都将悬空。
  • std::vector&lt;std::vector&lt;int&gt;&gt; -- 不使用这个的原因是什么?或者更好的是,std::vector&lt;int&gt; 并像二维数组一样管理它?而且,使用原始指针不会让你成为更好的 C++ 程序员,恕我直言。
  • @PaulMcKenzie 你很聪明。谢谢

标签: c++ containers


【解决方案1】:

*超出范围 * 值是由于 for 循环内的 vector&lt;int&gt; vec 和/或可能是由于 ij

  • 因此,要存储pointer,请使用pointer:使用vector&lt;int&gt; vec = new vector&lt;int&gt;() 之类的内容。

通过您的实现:在for 循环结束时,变量vec 被删除,并且它的地址可能被另一个变量使用。所以当你试图获取它的值时,很可能你没有得到你存储的东西。

  • 然后,确保当您得到ij 时:i 介于0n-1 之间。 j 介于向量的0var-1 之间。

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 2013-07-19
    • 2011-08-04
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多