2011-09-13 132 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]