减少迭代器

时间:2013-09-20 15:37:16

标签: c++

我有一个正常的迭代器到双向数据结构中的位置(实际上是向量)。现在我想对当前位置的过去x元素执行操作。之前总会有至少x个元素,尽管最后的x可能是向量的第一个元素。

我写了这段代码

vector<Record>::iterator it = itCurrentRecord;
for (unsigned int i = 0; i < length; i++)
{
    (it--)->length = length;
}

这样安全吗?我担心当它指向第一个元素时,最终的减量将导致迭代器在第一个元素之前指向一个元素,这是无效的。

如果是这样,我该如何以安全的方式重写它?

由于

4 个答案:

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