我有一个正常的迭代器到双向数据结构中的位置(实际上是向量)。现在我想对当前位置的过去x元素执行操作。之前总会有至少x个元素,尽管最后的x可能是向量的第一个元素。
我写了这段代码
vector<Record>::iterator it = itCurrentRecord;
for (unsigned int i = 0; i < length; i++)
{
(it--)->length = length;
}
这样安全吗?我担心当它指向第一个元素时,最终的减量将导致迭代器在第一个元素之前指向一个元素,这是无效的。
如果是这样,我该如何以安全的方式重写它?
由于
答案 0 :(得分:13)
使用反向迭代器:
vector<Record>::reverse_iterator it = itCurrentRecord;
for (unsigned int i = 0; i < length; i++)
{
(it++)->length = length;
}
允许在语义上指向一个开头之前,就像普通迭代器一样,允许指向一个结尾。
答案 1 :(得分:3)
您的担忧是有效的。由于这是一个随机访问迭代器,您可以使用算术来避免未定义的行为:
vector<Record>::iterator it = itCurrentRecord;
for (unsigned int i = 0; i < length; i++)
{
(it - i)->length = length;
}
答案 2 :(得分:0)
您可以在范围的开头启动it
并向前迭代。
vector<Record>::iterator it = std::prev(itCurrentRecord, length - 1);
for (unsigned int i = 0; i < length; i++)
{
(it++)->length = length;
}
注意:std::prev
是C ++ 11的一项功能。
答案 3 :(得分:0)
除了已经提到的解决方案之外,您还可以执行以下操作:
// assume vector<Record> v is filled;
vector<Record>::iterator it = currentRecord;
for_each(v.begin(), it, [&](Record& r)
{
r.length = length;
});
或者如果您需要/想要倒退(例如,如果迭代的顺序很重要):
for_each(reverse_iterator<vector<Record>::iterator>(it), v.rend(), [&](Record& r)
{
r.length = length;
});