[英]Decrementing an iterator
我有一個正常的迭代器到雙向數據結構中的位置(實際上是向量)。 現在我想對當前位置的過去x元素執行操作。 之前總會有至少x個元素,盡管最后的x可能是向量的第一個元素。
我寫了這段代碼
vector<Record>::iterator it = itCurrentRecord;
for (unsigned int i = 0; i < length; i++)
{
(it--)->length = length;
}
這樣安全嗎? 我擔心當它指向第一個元素時,最終的減量將導致迭代器在第一個元素之前指向一個元素,這是無效的。
如果是這樣,我怎樣才能以安全的方式重寫它?
謝謝
使用反向迭代器:
vector<Record>::reverse_iterator it = itCurrentRecord;
for (unsigned int i = 0; i < length; i++)
{
(it++)->length = length;
}
允許在語義上指向一個開頭之前,就像普通迭代器一樣,允許指向一個結尾。
您的擔憂是有效的。 由於這是一個隨機訪問迭代器,您可以使用算術來避免未定義的行為:
vector<Record>::iterator it = itCurrentRecord;
for (unsigned int i = 0; i < length; i++)
{
(it - i)->length = length;
}
您可以在范圍的開頭啟動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的一個特性。
除了已經提到的解決方案,您還可以執行以下操作:
// 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;
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.