C++ std::超出范围:向量::超出范围检查

C++ std::超出范围:向量::超出范围检查,c++,vector,C++,Vector,这是我的代码: #include <iostream> #include <stdexcept> #include <vector> #include <stdio.h> #include <stdlib.h> using namespace std; struct TeamS { int ID; string MEMBERS[3]; }; //Vector initialization void Initializ

这是我的代码:

#include <iostream>
#include <stdexcept>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

struct TeamS 
{
    int ID;
    string MEMBERS[3];
};
//Vector initialization
void Initialize (vector<TeamS> & TeamV, const int id[], const string m[][3], int arraySize)
{
    for(int i=0 ; i<4 ; i++)
    {
        TeamV.at(i).ID = id[i];
        for(int j=0 ; j<3 ; j++)
        {   
            TeamV.at(i).MEMBERS[j]=m[i][j];

        }
    }
}

void printList (const vector <TeamS>& TeamV)
{
     for(int i=0 ; i<4; i++)
    {
        cout<<"Information for team "<<i<<endl;
        cout<<TeamV[i].ID;
        for(int j=0 ; j<3 ; j++)
        {   
            cout<<"      "<<TeamV[i].MEMBERS[j]<<"     ";
        }
        cout<<endl;
    }
}

int main(int argc, char** argv) 
{
    short int choice;
    cout<<"Starting Initialization"<<endl;
    vector<TeamS> TeamV;
    const int ID [4] ={ 123, 321, 456, 789};
    const string MEMBERS [4] [3] =  {    {"Sarah", "Joe", "John"}, {"Chris", "Kevin", "James"}, {"Tom", "Kim", "Emily"}, {"Jill", "Jason", "Jim"}   };
    cout<<"Ending Initialization"<<endl;
    Initialize (TeamV, ID ,MEMBERS, 4);
    cout<<"**** Team List **** "<<endl;
    //printList(TeamV);
    cout<<"************************************************************************"<<endl;

    while(1)
    {
    cout<<"Enter 1 to see a list of teams"<<endl;
    cout<<"Enter 2 to add a team to the list"<<endl;
    cout<<"Enter 3 to search for a team using an ID"<<endl;
    cout<<"Enter 4 to end the program"<<endl;
    cout<<endl<<"Enter Choice : ";
    cin>>choice;
    if(choice == 1)
              {  printList(TeamV);  }
    else if(choice == 2)
              {                     }
    else if(choice ==3 )
              {                     }
    else if(choice == 4)
              {  exit(0);           }
    }

    return 0;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
结构团队
{
int-ID;
字符串成员[3];
};
//向量初始化
无效初始化(向量和TeamV,常量int-id[],常量字符串m[][3],int-arraySize)
{

对于(int i=0;i而言,在任何时候,您都没有在向量上添加任何内容。您的
Initialize()
以以下内容开头:

TeamV.at(i).ID = id[i];
但是如果
TeamV
为空,则会将
抛出范围之外

TeamV.push_back(TeamS()); // NOW, there's something in it
TeamV[i].ID = id[i];
最好向
团队
添加一个构造函数,该构造函数接受一个id和一些成员,这样循环就可以:

for (int i = 0; i < 4; ++i) {
    TeamV.push_back(TeamS(id[i], m[i]));
}
for(int i=0;i<4;++i){
团队V.推回(团队(id[i],m[i]);
}
或者在C++11中:

std::vector<TeamS> TeamV{
    {123, {"Sarah", "Joe", "John"}},
    {321, {"Chris", "Kevin", "James"}},
    ...
};
std::vector TeamV{
{123,{“莎拉”、“乔”、“约翰”},
{321,{“克里斯”、“凯文”、“詹姆斯”},
...
};

您似乎在main函数中创建了向量TeamV,并将其保留为空。它没有任何元素。但随后您调用了
Initialize(TeamV,…)

函数您试图通过
at()
访问TeamV的元素,但它是空的!

已经得到我的支持,但我想补充一下如何完全取消init例程并执行静态向量init。附录:@NomanShakoor这可能是定义构造函数最简单的方法:
团队(int-id,const-string(&members)[3])
。它不会捕获太小的团队,但会防止成员数组溢出。