C ++:当尝试在单个for循环中使用getlline()填充多个向量时,向量下标超出范围
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++:当尝试在单个for循环中使用getlline()填充多个向量时,向量下标超出范围相关的知识,希望对你有一定的参考价值。
当我尝试运行此代码时:
vector <string> names;
vector <string> telephones;
vector <string> emails;
for (int i = 0; i < 5;i++) {
cout << "enter name" << '\n';
getline(cin, names[i]);
cout << "enter telephone number" << '\n';
getline(cin, telephones[i]);
cout << "enter email address" << '\n';
getline(cin, emails[i]);
}
它编译得很好但是当我尝试运行它时,我得到“向量下标超出范围”错误消息。
答案
请定义向量的大小,因为仅定义向量不会为它们分配内存。
vector <string> names(5);
vector <string> telephones(5);
vector <string> emails(5);
for (int i = 0; i < 5;i++) {
cout << "enter name" << '\n';
getline(cin, names[i]);
cout << "enter telephone number" << '\n';
getline(cin, telephones[i]);
cout << "enter email address" << '\n';
getline(cin, emails[i]);
}
另一答案
使用任何push或emplace函数,您的矢量都不会被赋予起始大小或增加大小。在导致分配存储之前,不能使用[]
。
给
cout << "enter name" << '\n';
string temp;
getline(cin, temp);
names.push_back(temp);
等等......一试。
嫣
不要使用一个数据的三个数组,而是考虑制作一个结构
struct person
{
string name;
string telephone;
string email
};
然后是这个结构的单个矢量。
vector<person> people;
这使您能够创建一个函数,在一个裂缝中读取整个人,使得主循环逻辑更加简单,并且如果您将来向person
添加更多数据,则需要更少的维护。
person getPerson()
{
person temp;
cout << "enter name" << '\n';
getline(cin, temp.name);
cout << "enter telephone number" << '\n';
getline(cin, temp.telephone);
cout << "enter email address" << '\n';
getline(cin, temp.email);
return temp;
}
然后
for (int i = 0; i < 5;i++) {
people.push_back(getPerson());
}
另一答案
你不能直接在向量中输入。因为当你运行getline(cin,name [i])时,这个向量中没有分配'i'索引。有两种可能的解决方案。
解决方案1,首先分配所有索引:
vector <string> names;
vector <string> telephones;
vector <string> emails;
name.resize(5);
telephones.resize(5);
emails.resize(5);
for (int i = 0; i < 5;i++) {
cout << "enter name" << '\n';
getline(cin, names[i]);
cout << "enter telephone number" << '\n';
getline(cin, telephones[i]);
cout << "enter email address" << '\n';
getline(cin, emails[i]);
}
解决方案2,在运行时创建索引:
vector <string> names;
vector <string> telephones;
vector <string> emails;
for (int i = 0; i < 5;i++) {
string temp;
cout << "enter name" << '\n';
getline(cin, temp);
name.push_back(temp);
cout << "enter telephone number" << '\n';
getline(cin, temp);
telephones.push_back(temp);
cout << "enter email address" << '\n';
getline(cin, temp);
emails.push_back(temp);
}
以上是关于C ++:当尝试在单个for循环中使用getlline()填充多个向量时,向量下标超出范围的主要内容,如果未能解决你的问题,请参考以下文章
我正在尝试使用 For 循环在 .TXT 文件中写入数字 1 - 4096,但是当循环完成时,.TXT 文件中只有数字 4096
有两个循环,他们是嵌套关系,在内循环中使用break将终止哪一个循环?