矢量迭代器

时间:2011-09-13 02:47:35

标签: c++ vector iterator

我有以下代码。

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

7 个答案:

答案 0 :(得分: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();
}

另外,正如大家所说,在比较迭代器时使用!=,而不是<。虽然它在这种情况下会起作用,但是如果你使用不同的容器它会停止工作(这就是迭代器的用途:抽象底层容器)。

答案 1 :(得分: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();
}

答案 2 :(得分: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();
}

答案 3 :(得分:1)

首先考虑一下你是否确实需要一个指向该元素的指针,或者你是否只是想尝试使用迭代器,而是要避免它们。看起来你正在尝试用C ++编写C代码,而不是编写C ++代码。在您给出的示例中,似乎不是转换为指针然后使用该指针,为什么不直接使用迭代器? it->doSomething()代替ird->doSomething()

如果您认为需要保存该指针以便稍后在执行某些工作后在矢量上使用,那么这可能很危险。向量迭代器指向向量中元素的指针都可以无效,这意味着它们不再指向向量,所以你基本上在释放它之后尝试使用内存,这是一件危险的事情。 。可以使迭代器无效的常见示例是添加新元素。我陷入了试图存储迭代器的混乱,我做了很多工作来尝试使其工作,包括编写“re_validate_iterator()”函数。最终,我的解决方案被证明非常混乱,除了不可扩展外,甚至在所有情况下都不起作用。

尝试存储矢量位置的解决方案是将其存储为偏移量。一些整数,表示元素所在的向量中的位置。然后,如果需要使用迭代器,则可以使用myvector.begin() + index访问它;如果希望使用边界检查来引用元素本身,则可以使用myvector.at (index),如果不需要,则只需myvector [index]需要边界检查。

答案 4 :(得分:0)

您可以通过执行&*it从迭代器获取指针。您将获得指向存储在向量中的实际IRD对象的指针。您可以通过指针修改对象,修改将“粘住”:它将在矢量中保留。

但是,由于你的矢量包含实际的对象(不是指向对象的指针),我在dynamic_cast中看不到任何一点。指针的类型为IRD *,它指向IRD对象。

解除引用的迭代器可能引用副本(或更确切地说,代理对象)的唯一情况是vector<bool>,它可以实现为位向量。

答案 5 :(得分:0)

  

当我迭代向量指针irds时,我究竟在迭代什么?它是每个元素的副本,还是当我说(* it)时,我正在使用向量中的实际对象.doSomething(),

当你迭代一个向量时,你使用对象本身,而不是它的副本。

答案 6 :(得分:0)

通常的习惯用语是&amp; *它来获取指针。动态演员阵容与它无关。