矢量下标超出范围,同时读取矢量

时间:2018-05-30 12:06:22

标签: c++

当我尝试运行此程序时出现崩溃,错误是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++;
}

我试过没有调整大小也是一样的。

2 个答案:

答案 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));