向量迭代器
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)。到处都是。
- 如何获得指向对象的指针?
- 当我迭代vector指针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()
如果你认为在做了一些操作后需要保存指针以供稍后在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来获取指针。动态强制转换与此无关。
- 使用迭代器时如何访问对象在向量中的位置?
- 在 C++ 向量构造中包含迭代器
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- C++迭代器和向量
- 在无法访问向量的情况下查找迭代器的末尾
- C++ 向量插入和迭代器混淆
- 如何在C++中仅使用迭代器正确迭代 3D 向量?
- C++结构编译器错误询问向量的迭代器
- 为什么迭代器没有到达向量末端?
- 如何使用迭代器填充未知大小的向量?
- C++如何为向量向量构建迭代器
- 如何使用迭代器指向结构体c++的向量
- std::向量迭代器和调整大小/保留的奇怪/有趣行为
- 在C++中使用带有自定义向量的迭代器
- 使用条件迭代器插入到向量中
- 如何取消引用向量迭代器
- 如何从给定另一个迭代器向量的向量中删除元素
- 为什么迭代器向量::插入在填充后无效:迭代器插入(const_iterator位置,size_type n,常量value_type和val);
- C++ - 迭代器向量未编译的迭代器
- 对迭代器向量的重载<<