C ++中的2D向量数组

时间:2019-04-23 15:40:45

标签: c++

该程序启动,但是在输入数据时会引发错误(在Visual Studio中:Expression:矢量下标超出范围)
我一定在做错事,但是我对向量数组很陌生,所以我想学习它们;)
另外,我想知道,当向量数组的大小未知(可能会有所不同)时,要使用什么循环条件

#include <iostream>
#include <conio.h>
#include <vector>
#include <string>

using namespace std;

int main()
{
    vector<vector<string>> v; // 2D vector array
    string stri; // Input Data

    for (auto i = 0;; i++)
    {
        for (auto j = 0;; j++)
        {
            cout << "Enter array's " << i << " and " << j << " element:";
            cin >> stri;
            v[i][j] = stri;
        }
    }
    for (auto i = 0;; i++)
    {
        for (auto j = 0;; j++)
        {
            cout << v[i][j] << "\t";
        }
        cout << endl;
    }
    _getch();
}

感谢帮助;)

2 个答案:

答案 0 :(得分:4)

有两个问题。首先,不对向量进行初始化。默认情况下,向量具有0个元素,因此当您尝试访问v[i][j]时,它会抱怨它超出范围。其次,没有条件退出循环,使循环无限。假设您事先知道数组的大小,请尝试以下操作:

#include <iostream>
#include <conio.h>
#include <vector>
#include <string>

using namespace std;

int main()
{
    size_t n = 4;
    size_t m = 3;
    vector<vector<string>> v(n, vector<string>(m)); // 2D vector array
    string stri; // Input Data

    for (auto i = 0; i<v.size(); i++)
    {
        for (auto j = 0; j<v[i].size(); j++)
        {
            cout << "Enter array's " << i << " and " << j << " element:";
            cin >> stri;
            v[i][j] = stri;
        }
    }
    for (auto i = 0; i<v.size(); i++)
    {
        for (auto j = 0; j<v[i].size(); j++)
        {
            cout << v[i][j] << "\t";
        }
        cout << endl;
    }
    _getch();
}

如果您事先不知道尺寸,并且希望用户决定,请尝试以下操作:

int main()
{
    vector<vector<string>> v; // 2D vector array
    string stri; // Input Data

    for (auto i = 0; ; i++)
    {
        v.emplace_back();
        for (auto j = 0; ; j++)
        {
            cout << "Enter array's " << i << " and " << j << " element (Enter 'End' to end the row): ";
            cin >> stri;
            if(stri == "End")
                break;
            v[i].push_back(stri);
        }
        cout << "Do you want to add another row? [y/n] ";
        char c;
        cin >> c;
        if (c == 'n')
            break;
    }
    for (auto i = 0;i<v.size(); i++)
    {
        for (auto j = 0;j<v[i].size(); j++)
        {
            cout << v[i][j] << "\t";
        }
        cout << endl;
    }
    getch();
}

答案 1 :(得分:1)

所以代码中的v是向量的向量。然后在您的代码行中:

v[i][j] = stri;

只有在满足以下条件时才可以:

  • 向量v的大小大于i,因此可以使用v [i]
  • 向量v [i]的大小大于j,因此可以使用v [i] [j]

您可以使用resize函数来设置矢量的大小。如果您这样修改代码,添加两个resize调用,那么您的代码就可以成功使用向量几次,但是直到达到大小为止:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
  vector<vector<string>> v; // 2D vector array
  v.resize(5);
  string stri; // Input Data

  for (auto i = 0;; i++)
    {
      v[i].resize(5);
      for (auto j = 0;; j++)
        {
          cout << "Enter array's " << i << " and " << j << " element:";
          cin >> stri;
          v[i][j] = stri;
        }
    }
}

以上程序将一直存在,直到达到大小5,然后它再也无法工作了。由于循环是无限的,所以无论如何它都是一个奇怪的程序。我将保持为零,而j将永远增加(或者实际上直到达到向量大小为止)。