簡體   English   中英

減少迭代器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM