【问题标题】:Multidimensional Vector?多维向量?
【发布时间】:2017-07-25 21:04:04
【问题描述】:

所以我最近开始学习 C++,并试图弄清楚如何访问多维向量或其中存储有向量的向量。我找遍了所有地方,但我找不到我要找的东西。我希望能够通过打印出来来测试多维向量中每个向量的内容。此外,每当我尝试在每次迭代后查看向量的大小时,我都会得到每次迭代的随机常数。它们看起来可能是内存位置,但我不确定。

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


int main() {
int numofArrays;
int numofQueries;

vector<vector<int>> arr(numofArrays);

cin >> numofArrays;
cin >> numofQueries;

int arrSize;
int number;
vector<int> indArr; 

// Outer loop, appends vectors containing ints to a multidimensional vector
for (int i = 0; i < numofArrays; i++) {
    cin >> arrSize; // Getting number of elements from user

    // Inner loop, gets user inputted values then creates a vector which is added to the multidimensional vector
    for (int x = 0; x < arrSize; x++) {
        cin >> number; 
        indArr.push_back(number); 
        cout << "Last number added to vector: " << number << endl; // Checking to see if correct numbers are being added. 
    }

    arr.push_back(indArr);
    cout << "Multidimensional Vector size: " << arr.size() << endl; // Checking size of vector after each iteration
    indArr.clear(); // Empties vector for next iteration
}


  return 0;
}

由于我是 C++ 新手,我欢迎建设性的批评。

新修订的代码:

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


int main() {
int numofArrays;
int numofQueries;


cin >> numofArrays;
cin >> numofQueries;

vector<vector<int>> arr(numofArrays);


// Outer loop, appends vectors containing ints to a multidimensional vector
for (int i = 0; i < numofArrays; i++) {
    int arrSize;
    vector<int>indArr;
    cin >> arrSize; // Getting number of elements from user
    indArr.resize(arrSize); // Resizing array for next values
    // Inner loop, gets user inputted values then creates a vector which is added to the multidimensional vector
    for (int x = 0; x < arrSize; x++) {
        int number;
        cin >> number; 
        indArr.push_back(number); 
        cout << "Last number added to vector: " << number << endl; // Checking to see if correct numbers are being added. 
    }

    arr.push_back(indArr);
    cout << "Multidimensional Vector size: " << arr.size() << endl; // Checking size of vector after each iteration
}

int test = arr[0][0];
cout << test;



  return 0;
}

【问题讨论】:

  • 你需要做的就是弄清楚如何使用向量,因为“多维向量”只是一个向量。
  • 但是我以前使用过向量,它的行为不像任何向量。你能解释一下我做错了什么吗?为什么每当我打印出“cout
  • 可能是一些无聊的东西,比如代码中的错误。
  • 对于矩阵,我建议使用线性代数库,例如 BlazeEigen
  • 感谢 Henri 的一些实际建议,我会这样做,但这只是对 Hackerrank 的一个简单挑战。其他一切都很简单,但由于某种原因,我无法在多维向量中打印向量内部的值,并且每当我打印出大小时,它都会显示一个非常大的数字。

标签: c++ multidimensional-array vector


【解决方案1】:

只是一些提示:

vector&lt;vector&lt;int&gt;&gt; arr(numofArrays); 构造一个大小为numofArrays 的向量。但是 numofArrays 还没有从 cin 中读取,所以它是一个未定义的数字。注意操作顺序。

arr.push_back(indArr); 在 arr 末尾添加一个向量。

因此,在您的循环中,即使您修复了读取numofArrays 和声明arr 的顺序,您也会从一个大小为numofArrays 的数组开始,并且每个循环都添加一个元素。你最终会得到 arr 持有 2 次 numofArrays 元素。

另外,indArr 是一个临时变量,您可以在每个循环中重置它。尽管您所做的事情并没有错,但通常最好将每个变量限制在其范围内。如果你在循环中定义indArr,它将被自动清除并重新创建。在所有情况下可能不是最有效的做事方式,但我会把这些细节留到以后。

这样的东西应该适合你:

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

int main() {
  int numofArrays;
  int numofQueries;

  cin >> numofArrays; 
  cin >> numofQueries; // this is an unused variable

  vector<vector<int> > arr;

  // Outer loop, set vectors containing ints to a multidimensional vector
  for (int i = 0; i < numofArrays; i++) {
    int arrSize;
    vector<int> indArr; 
    cin >> arrSize; // Getting number of elements from user

    // Inner loop, gets user inputted values then creates a vector which is added to the multidimensional vector
    for (int x = 0; x < arrSize; x++) {
      int number;
      cin >> number; 
      indArr.push_back(number); 
        cout << "Last number added to vector: " << number << endl; // Checking to see if correct numbers are being added. 
    }

    arr.push_back(indArr);
    cout << "Multidimensional Vector size: " << arr.size() << endl; // Checking size of vector after each iteration
  }

  return 0;
}

【讨论】:

  • 感谢您的提示,我采纳了您的建议,每当我尝试从向量中打印出其中一个值时都会收到分段错误
  • 我没有遇到段错误。你能发布有问题的代码吗?
  • 还将使用 numofQueries 但程序尚未结束。
  • 请重新阅读我的答案和我的代码。在您修改后的代码中,您仍然使用vector&lt;vector&lt;int&gt;&gt; arr(numofArrays)arr 初始化为非空。因此arr[0] 指向某个东西,但它是一个空数组。这就是您在尝试访问arr[0][0] 时收到错误的原因,因为没有第一个元素。 `
  • 感谢您的解决方案解决了我的问题,现在我可以完成程序的其余部分了。我真的很感激它。我仍然习惯于 C++ 的工作方式,它看起来非常广阔,但真的很棒。
【解决方案2】:

您检查尺寸的方式是正确的。例如,在您的代码中,您正在打印数组arr 的第一维中的整数个元素。

你得到的奇怪结果是因为你初始化向量的方式。在arr 的构造函数中,您可以指定一个大小来描述填充向量的默认构造元素的数量。但是,您提供的 numofArrays 是一个未定义的值。因此,当您打印出来时,您会收到随机的矢量大小。

由于push_back 操作,向量arr 的第一个维度的实际大小将是这个未定义值加一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 2017-08-20
    • 2011-09-03
    • 1970-01-01
    • 2013-11-21
    • 2013-07-24
    • 1970-01-01
    相关资源
    最近更新 更多