[英]Vector iterators
我有以下代碼。
vector<IRD>* irds = myotherobj->getIRDs();//gets a pointer to the vector<IRD>
for(vector<IRD>::iterator it = irds->begin(); it < irds->end(); it++)
{
IRD* ird = dynamic_cast<IRD*>(it);
ird->doSomething();
//this works (*it).doSomething();
}
這似乎失敗了...我只想在不使用(* it)的情況下獲得指向向量中每個元素的指針。 遍。
為什么要獲取指針?
使用參考:
for(vector<IRD>::iterator it = irds->begin(); it != irds->end(); ++it)
{
IRD & ird = *it;
ird.doSomething();
}
或者:
for(vector<IRD>::iterator it = irds->begin(); it != irds->end(); ++it)
{
it->doSomething();
}
而且,正如大家所說,比較迭代器時請使用!=
,而不要使用<
。 雖然在這種情況下可以正常工作,但是如果您使用其他容器,它將停止工作(這就是迭代器的作用:抽象基礎容器)。
您需要對迭代器使用!=
來測試結束,而不是像對指針那樣使用<
。 operator<
恰好與vector
迭代器一起使用,但是如果您將容器(切換到類似list
容器)切換,則您的代碼將不再編譯,因此使用!=
通常是好的。
另外,迭代器不是其指向的類型,因此請勿嘗試對其進行強制轉換。 您可以在迭代器上使用重載的operator->
。
vector<IRD>* irds = myotherobj->getIRDs();//gets a pointer to the vector<IRD>
for(vector<IRD>::iterator it = irds->begin(); it != irds->end(); ++it)
{
it->dosomething();
}
取消引用迭代器以獲得對基礎對象的引用。
vector<IRD>* irds = myotherobj->getIRDs();
for(vector<IRD>::iterator it = irds->begin(); it != irds->end(); ++it)
{
IRD& ird = *it;
ird.doSomething();
// alternatively, it->doSomething();
}
首先考慮是否確實需要指向元素的指針,或者是否只是嘗試使用迭代器而避免使用它們。 看來您正在嘗試使用C ++編寫C語言,而不是編寫C ++語言。 在您給出的示例中,似乎不是轉換為指針然后使用該指針,而是為什么不直接使用迭代器呢? it->doSomething()
代替ird->doSomething()
如果您認為需要做一些工作后保存該指針,以便稍后在向量上使用,則可能存在危險。 向量迭代器和指向向量中元素的指針都可能無效,這意味着它們不再指向向量,因此您基本上在釋放內存后嘗試使用內存,這是很危險的事情。 可能會使迭代器無效的常見示例是添加新元素。 我陷入了試圖存儲迭代器的麻煩之中,並且我做了很多工作來嘗試使其工作,包括編寫一個“ re_validate_iterator()”函數。 最終,我的解決方案被證明非常混亂,除了無法擴展之外,它甚至在所有情況下都無法正常工作。
嘗試存儲向量位置的解決方案是將其存儲為偏移量。 一些整數,指示元素在向量中的位置。 然后,如果需要使用迭代器,則可以使用myvector.begin() + index
進行訪問;如果要通過邊界檢查引用元素本身,則可以使用myvector.at (index)
如果需要,則可以使用myvector [index]
不需要邊界檢查。
您可以通過&*it
從迭代器獲取指針。 您將獲得指向存儲在向量中的實際IRD
對象的指針。 您可以通過指針修改對象,修改將“粘住”:它將保留在向量內。
但是,由於您的向量包含實際對象(而不是對象的指針),因此在dynamic_cast
中看不到任何點。 指針的類型為IRD *
,它指向IRD
對象。
被取消引用的迭代器可能引用副本(或更確切地說是代理對象)的唯一情況是vector<bool>
,它可以實現為位向量。
當我遍歷向量指針irds時,我到底遍歷了什么? 是每個元素的副本,還是我說(* it).doSomething()時正在處理矢量中的實際對象,
遍歷向量時,將使用對象本身,而不是對象的副本。
通常的習慣用法是&* it獲取指針。 動態轉換與它無關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.