【问题标题】:Creating a vector of structs, expression: vector subscript out of range创建结构体向量,表达式:向量下标超出范围
【发布时间】:2018-06-29 00:13:49
【问题描述】:

我是非常接触 c++ 的新手,目前正在尝试完成一些小挑战以跟上更简单的方面。

我正在尝试创建一个结构数组(找到的信息表明向量相同且更好)来保存大约 10 人的数据。每个人都有一个“索引”(用于识别 person1、person2、person3 等)、一个“num”(用于存储收集的数据)和一个“rank”(我打算用来对人员进行排序的变量)收集的数据)

代码在编译之前没有显示任何错误,但是,当输入第一条数据时,我收到以下消息:

“调试断言失败!

程序:C:\WINDOWS\SYSTEM32\MSVCP140D.dll 文件:d:\program files\microsoft visual studio\community\vc\tools\msvc\14.12.25827\include\vector 线路:1795

表达式:向量下标超出范围"

我已尝试搜索多个线程,但我似乎无法弄清楚为什么会出现此问题。

我的代码:

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

using namespace std;

struct person
{
    int index; /*person number*/
    int num; /*number of pancakes eaten*/
    int rank; /*rank used for sorting people*/
};

vector<person> people; /*create a vector (array) of "person"'s*/

void getData()
{
    cout << "You will be asked to enter data from 10 different people" << endl;
    cout << "\n" << "The question is; 'How many pancakes did they eat for breakfast?'" << endl;
    cin.get();

    for (int i = 1; i <= 10; i++)
    {
        system("CLS");
        int j;
        cout << "Person " << i << " : ";
        cin >> j;

        person temp;

        people.push_back(temp);

        people[i].index = i;
        people[i].num = j;
        people[i].rank = i;
    }
}

int main()
{
    getData(); /*collect data for the people*/

    system("CLS");

    cout << "Data Collected : " << endl;

    system("pause");
}

提前感谢任何可以提供帮助的人。

【问题讨论】:

标签: c++ arrays vector struct


【解决方案1】:

问题在于您的索引。索引从 0 而不是 1 开始。所以当你推送第一个元素时会发生什么,它存储在people[0]。然后你尝试访问people[1],因为i = 1。因此下标超出范围错误。

你需要修改代码为:

....
for (int i = 0; i < 10; i++)
{
    system("CLS");
    int j;
    cout << "Person " << i << " : ";
    cin >> j;

    person temp;

    people.push_back(temp);

    people[i].index = i;
    people[i].num = j;
    people[i].rank = i;
}
....

【讨论】:

  • 我这辈子从来没有这么用力过脸,我真的应该发现这一点。很抱歉在这么简单的修复上浪费了您的时间!显然我太累了!感谢您的帮助!
  • 完全没有问题,我们都度过了糟糕的一天!希望这个答案可以帮助一些未来疲惫迷失的灵魂!
  • 另外请注意,如果您想获取向量中的最后一项,而不是[i],您可以使用people.back() 返回对放置在向量中的最后一项的引用。这样一来,无论 i 如何工作,您的代码都会正常工作。
  • 谢谢保罗,我现在就做出改变!
  • 在许多情况下,使用person&amp; last_person = person.back(); 并且只使用last_person 而不是每次都指定索引更容易。更容易理解,有时打字更少,没有索引需要处理,并且取决于它的使用位置,可以优化代码(稍微)。
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多