需要有关矢量超出范围错误的帮助

Posted

技术标签:

【中文标题】需要有关矢量超出范围错误的帮助【英文标题】:need help with vector out of range error 【发布时间】:2011-02-25 00:35:27 【问题描述】:

伙计们,我正在从文件中读取并输入到向量中,但我不断收到一个弹出框:“向量员工超出范围!”错误。就像我试图访问传递向量中的最后一个索引一样,但如果是这种情况,我看不到......任何帮助表示赞赏 文本文件:

123 vazquez 60000
222 james 100000
333 jons 50000
444 page 40000
555 plant 40000

代码:

#include <iostream>
#include <string>
#include <fstream>
#include <vector>
using namespace std;

struct employees  int id; string lname; double salary; ;
void getData(vector<employees>& list, ifstream& inf);
int i = 0;
int main()

    string filename("file2.txt");
    vector<employees> list;
    ifstream inf;
    inf.open(filename);

    getData(list, inf);
    inf.close();

    for(unsigned int j = 0; j < list.size(); j++)
    
        cout << list[j].id << " " << list[i].lname << endl;
    

    system("pause");
    return 0;


void getData(vector<employees>& list, ifstream& inf)

    int i = 0;
    while(inf)
    
        inf >> list[i].id >> list[i].lname >> list[i].salary;
        i++;
    

【问题讨论】:

Loading data into a vector of structures的可能重复 【参考方案1】:

当您将list 传递给getData() 时,其中的元素为零。然后您尝试访问索引i(从0 开始)处的元素,但没有这样的元素,因此出现错误。

您需要向容器中插入新元素;最简单的方法是创建一个临时对象,将数据读入该对象,然后将该对象插入容器中。

employee e;
while (inf >> e.id >> e.lname >> e.salary)
    list.push_back(e);

请注意,这也修复了您不正确的输入循环。在您的错误循环中,流可能会在循环中的一次读取期间达到 EOF 或以其他方式失败,但直到您增加 i 之后您才会检测到这一点。

【讨论】:

请注意,该向量的类型为 ,它是一个结构体......我实现了您的想法,但出现错误:错误 C2039: 'id' : is not a member 'std::vector<_ty>'【参考方案2】:

getData 的while 循环中,每次都需要push_backemployees。或者您可以为您的employees 类定义&gt;&gt; operator,您甚至不需要getData 函数,您可以将istream_iterator 传递到vector 构造函数中。

使用istream_iterator的示例:

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

struct employee  int id; std::string lname; double salary; ;
std::istream& operator>>(std::istream& is, employee& e) 
  return is >> e.id >> e.lname >> e.salary;


int main() 
  std::string filename("file2.txt");
  std::ifstream inf;
  inf.open(filename); //add error checking here

  std::vector<employee> list((std::istream_iterator<employee>(inf)), std::istream_iterator<employee>());
  for (std::vector<employee>::iterator iter = list.begin(); iter != list.end(); ++iter) 
    std::cout << iter->id << " " << iter->lname << std::endl;
  
  return 0;

【讨论】:

【参考方案3】:

list[i].lname 应该是list[j].lname

【讨论】:

以上是关于需要有关矢量超出范围错误的帮助的主要内容,如果未能解决你的问题,请参考以下文章

矢量下标超出范围错误消息 3

矢量擦除迭代器超出范围[关闭]

如何使用 mpi scatter 修复“矢量下标超出范围”?

重命名两个目录中的文件名如果它们之间的某些字符匹配 - 矢量下标超出范围

为啥我会出现超出范围的错误?

矢量调整大小后下标超出范围