2011-09-13 66 views
0

我有以下代碼。向量迭代器

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(),

回答

5

爲什麼要獲取指針?

使用參考:

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(); 
} 

而且,大家都在說,比較迭代器時,不能使用<!=。雖然它在這種情況下會起作用,但如果您使用不同的容器,則它將停止工作(這就是迭代器的用途:抽象底層容器)。

+0

謝謝解答這兩個問題,並修復了一個錯誤!來自C ...總是忘記引用類型...在某種意義上它們就像一個抽象指針嗎? – user623879

+0

@ user623879迭代器被設計成「看起來像」一個指針。實際上,指針可以被看作是迭代器的一個特例(它實際上是原始數組的迭代器類型)。 –

0

你可以通過做&*it從迭代器中獲得一個指針。你會得到一個存儲在vector中的實際對象的指針。您可以通過指針修改對象,修改將「粘住」:它將保持在向量內。

但是,由於您的向量包含實際對象(不是指向對象的指針),所以我在dynamic_cast中看不到任何點。指針的類型是IRD *,它指向IRD對象。

解除引用的迭代器可能引用副本(或更準確地說,代理對象)的唯一情況是vector<bool>,它可能實現爲位向量。

2

你需要使用!=與迭代器來測試結束,而不是<就像你會用指針。 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(); 
} 
0

當我遍歷向量指針IRDS,究竟我在遍歷?它是每個元素的副本,還是我用向量中的實際對象工作時,我說(* it).doSomething(),

當您遍歷一個向量處理對象本身時,不是它的副本。

1

取消引用迭代器以獲取對基礎對象的引用。

vector<IRD>* irds = myotherobj->getIRDs(); 
for(vector<IRD>::iterator it = irds->begin(); it != irds->end(); ++it) 
{ 
    IRD& ird = *it; 
    ird.doSomething(); 
    // alternatively, it->doSomething(); 
} 
0

通常的成語是& *它得到一個指針。動態演員陣容與它無關。

1

首先考慮你是否確實需要一個指向元素的指針,或者如果你只是試圖使用迭代器,但有點避免它們。它看起來像你試圖用C++編寫C代碼,而不是編碼C++。在你給出的例子中,它似乎不是轉換爲指針,然後使用該指針,爲什麼不直接使用迭代器? it->doSomething()而不是ird->doSomething()

如果您認爲您需要保存該指針,以便稍後在做一些工作後使用該矢量,那麼這可能很危險。矢量迭代器指向矢量中的元素的指針都可以被無效化,這意味着它們不再指向矢量,因此基本上在試圖釋放它之後嘗試使用內存,這是一件危險的事情。一個可以使迭代器失效的常見示例是添加一個新元素。我陷入了試圖存儲迭代器的混亂之中,並且做了大量工作來嘗試使其工作,包括編寫「re_validate_iterator()」函數。最終,我的解決方案被證明非常混亂,甚至在所有情況下都沒有工作,除了不可擴展。

嘗試存儲矢量位置的解決方案是將其存儲爲偏移量。一些整數,指示元素所在向量中的位置。如果您需要使用迭代器,則可以使用myvector.begin() + index訪問它,如果您想通過邊界檢查引用元素本身,則可以使用myvector.at (index),如果不需要邊界檢查,則只需myvector [index]