需要有关矢量超出范围错误的帮助
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
之后您才会检测到这一点。
【讨论】:
请注意,该向量的类型为在getData
的while 循环中,每次都需要push_back
和employees
。或者您可以为您的employees
类定义>> 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
【讨论】:
以上是关于需要有关矢量超出范围错误的帮助的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 mpi scatter 修复“矢量下标超出范围”?