7

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

我写了这段代码

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

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

如果是这样,我怎样才能以安全的方式重写它?

谢谢

4

4 回答 4

13

使用反向迭代器:

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

它允许在语义上指向一个在开始之前,就像一个普通的迭代器被允许指向一个过去的结束。

于 2013-09-20T15:42:06.557 回答
4

你的担心是有道理的。由于这是一个随机访问迭代器,您可以使用算术来避免未定义的行为:

vector<Record>::iterator it = itCurrentRecord;
for (unsigned int i = 0; i < length; i++)
{
    (it - i)->length = length;
}
于 2013-09-20T15:43:41.163 回答
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 的一个特性。

于 2013-09-20T15:51:18.533 回答
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;
});
于 2013-09-20T15:58:48.770 回答