簡體   English   中英

矢量迭代器

[英]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)的情況下獲得指向向量中每個元素的指針。 遍。

  1. 如何獲得指向對象的指針?
  2. 當我遍歷向量指針irds時,我到底遍歷了什么? 是每個元素的副本,還是我說(* it).doSomething()時正在處理矢量中的實際對象,

為什么要獲取指針?

使用參考:

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.

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