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

在单个应用程序中打开多个 websocket 连接

有两个循环,他们是嵌套关系,在内循环中使用break将终止哪一个循环?

在 R 中使用 for 循环绘制多个图

在python中使用for循环时出现JSONDecodeError [重复]

为啥这个for循环不执行?