当我尝试运行此程序时出现崩溃,错误是Expression:vector subscriptout of range。有什么问题?
std::vector<DepositCustomers> Deposits; //depositcustomers is a class
std::ifstream fin("in.txt");
int contor = 1;
while (!fin.eof())
{
Deposits.resize(contor);
fin >> Deposits[contor];
contor++;
}
我试过没有调整大小也是一样的。
答案 0 :(得分:4)
如果您将矢量调整为大小1
,则矢量中只有1个项目的空间。由于向量使用从0开始的索引,因此该项目位于索引0
。因此,当您尝试在索引1
处放置某些内容时,它会因观察到的错误而失败。
要使代码有效,您可以进行以下更改:
fin >> Deposits[contor - 1];
或者可能更好,使用push_back
来节省自己调整大小的麻烦。
答案 1 :(得分:1)
问题是向量(如数组)是零索引的 - 如果您有k
个元素,它们会从0
索引到k - 1
。
因此,Deposits[contor]
超出了向量的范围,因为它具有contor
个元素
(您很幸运,您构建了一个检查索引并快速找到的调试版本。)
您可以通过撰写Deposits[contor-1]
来解决此问题,但还有其他问题。
该问题是您使用.eof()
作为循环条件
eof()
并不代表您认为它意味着什么,而且您将存储一个元素太多
(有关详细信息,请参阅this Q&A。)
&#34;默认&#34; C ++输入循环看起来像
std::vector<DepositCustomers> Deposits;
std::ifstream fin("in.txt");
DepositCustomers customer;
while (fin >> customer)
{
Deposits.push_back(customer);
}
无循环版本
std::vector<DepositCustomers> Deposits;
std::ifstream fin("in.txt");
using iterator = std::istream_iterator<DepositCustomers>;
std::copy(iterator(fin), iterator(), std::back_inserter(Deposits));