该程序启动,但是在输入数据时会引发错误(在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();
}
感谢帮助;)
答案 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;
只有在满足以下条件时才可以:
您可以使用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将永远增加(或者实际上直到达到向量大小为止)。