向量迭代器

Vector iterators

本文关键字:迭代器 向量      更新时间:2023-10-16

我有以下代码:

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. 当我迭代vector指针irds时,我到底在迭代什么?它是每个元素的副本,还是当我说(*it).doSomething(),
  3. 时,我正在使用向量中的实际对象?

为什么你想要一个指针?

使用引用:

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

如果你认为在做了一些操作后需要保存指针以供稍后在vector上使用,这是潜在的危险。Vector迭代器和指向Vector中元素的指针都可能失效,这意味着它们不再指向Vector,因此基本上是在释放内存后尝试使用内存,这是一件危险的事情。可以使迭代器失效的一个常见示例是添加新元素。我陷入了试图存储迭代器的混乱中,我做了很多工作来尝试使它工作,包括编写一个"re_validate_iterator()"函数。最终,我的解决方案被证明是非常令人困惑的,甚至不能在所有情况下工作,除了不可扩展。

试图存储向量位置的解决方案是将其存储为偏移量。指示元素在向量中的位置的整数。然后,如果需要使用迭代器,可以使用myvector.begin() + index访问它;如果需要使用带有边界检查的元素本身的引用,可以使用myvector.at (index)访问它;如果不需要进行边界检查,可以使用myvector [index]访问它。

您可以通过执行&*it从迭代器获得指针。您将获得一个指向存储在vector中的实际IRD对象的指针。你可以通过指针修改对象,修改后的对象会"粘住":它会一直存在于vector对象中。

然而,因为你的向量包含实际的对象(不是指向对象的指针),我没有看到dynamic_cast中的任何点。指针的类型是IRD *,它指向IRD对象。

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

当我迭代vector指针irds时,我到底在迭代什么?当我说(*it).doSomething(),

时,它是每个元素的副本,还是使用向量中的实际对象?

当你迭代vector对象时,你是在处理vector对象本身,而不是它的副本。

通常使用&*it来获取指针。动态强制转换与此无关。