所以我从文本文件中读取了vector<string>
行。事情就是这些线组成了一小组数据。我想要做的是基本上迭代这些数据块。 (每个可以是3行或4行。我们可以通过查看第2行的内容来判断。)
一些示例数据可能是这样的:
链接
1
苹果
或
链接
2
苹果
香蕉
目前我尝试做的是以下内容:
for(vector<string>::size_type i = 0; i != records.size(); i++){
cout << "Test << endl;
string a = records[i];
string b = records[i+1];
string c = records[i+2];
i += 3;
}
基本上我试图将i
从名称跳转到名称,无论它是3还是4行块。
然而,由于可能显而易见的原因,这不起作用。问题是:
如何迭代一个向量,这样我就可以跳线,但它不会反复尝试遍历每一行并导致错误?
因为现在当我尝试这样做时(仅使用2,3行记录的测试用例)并且它不起作用。我应该只使用那个循环阅读两次,但我读的方式不止于此,不知何故。那么我该如何解决呢?
答案 0 :(得分:2)
首先,您需要确保您的循环不会超出并超出范围。这只需通过更改条件来确保索引小于而不是向量的大小。
然后,您需要通过将第二行转换为用于获取剩余数据的数字来实际获取向量中有效“行”的数量。
考虑到你的输入,我会做这样的事情:
for(vector<string>::size_type i = 0; i < records.size(); /* note no increment */){
string name = records[i];
unsigned long count = stoul(records[i + 1]);
for (unsigned long j = 0; j < count && i + j < records.size(); ++j){
// Read and do something with records[i + j]
}
i += 2 + count;
}
请注意,在进入外部循环之前,您应该检查records
的大小是否至少为2
。
答案 1 :(得分:0)
基于迭代器的替代方案,基于@ Someprogrammerdude的答案。
typedef vector<string>::const_iterator iterator;
for (iterator it = records.begin(); records.end() - it > 1; /* note no increment */)
{
string name = *it++;
unsigned long count = stoul(*it++);
for (; count && it != records.end(); --count, ++it){
// Read and do something with *it
}
}