我能得到一个指向当前迭代器值的指针吗?
Can I get a pointer to a current iterator value
在我的类中,我有两个私有成员:
std::list<MyObject> objects;
MyObject *selecteObj;
当一个事件发生时,我想遍历列表并运行某种测试,该测试只会对列表中的一个项目产生true。我想保存一个指向该项的指针,以便在其他地方使用。
std::list<MyObject>::iterator i;
for (i = objects.begin(); i!=objects.end(); ++i){
if (i->test())
selectedObj = i;
}
在其他方法
if (selectedObj !=null)
tmpObj->doSomething();
然而,这不起作用,因为i
不是指针,它是一个迭代器,即使你可以把它当作指向MyObject
的指针。
是否可以检索迭代器内部存储的指针以供其他地方使用?
我想错了吗?
完成我想做的事情的正确方法是什么?
是否可以检索迭代器内部存储的指针以供其他地方使用?
当然,只要用*
解引用迭代器,然后通过&
获得指向对象的指针:
selectedObj = &*i;
顺便说一句,你记得在循环之前用NULL
初始化selectedObj
吗?
是否可以检索迭代器内部存储的指针以供其他地方使用?
是的。正如@FredOverflow所说,这样做:
selectedObj = &*i;
但是,如果您可以使用c++ 11的特性,那么您可以使用基于范围的 for
循环编写更好的语法,如:
MyObject *selectedObj = NULL;
for (MyObject & obj : objects)
{
if (obj.test())
selectedObj = &obj; //store the address
}
看起来更好?不需要迭代器和编写像&*i
这样的语法。还应该注意的是,如果类MyObject
重载了operator &
,那么&*i
将无法工作,因为它将调用operator&
函数,而不是获取对象的地址!如果是这样,那么你已经写了(MyObject*)&(char&)*i
来获得*i
的地址,或者在c++ 11中,你可以使用std::addressof(*i)
,如果你不能使用c++ 11,你可以自己定义:
template< class T >
T* addressof(T& arg) {
return (T*)&(char&)arg;
}
std::addressof
相关文章:
- std::vector::迭代器是否可以合法地作为指针
- 不明白迭代器,引用和指针失效,一个例子
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 在C++中释放内存期间,迭代器与指针有何不同
- 迭代器的指针操作问题
- 对于随机访问迭代器(矢量迭代器),迭代器C++样式指针吗?
- 专门C++使用指针值类型的通用迭代器的模板函数?
- 从 std::vector 迭代器中执行函数指针
- 使用 map<char,strring> 的迭代器返回指针 map<char,strring>*
- 迭代器是否分配内存(如指针)?
- 如何在C++中重新实现包含指针的 STL 容器的类的迭代器
- 向量<pointer>:插入(迭代器,指针)插入垃圾值
- 迭代器可以变成指针吗?
- 使用迭代器指针 (C++) 从对象指针列表中删除元素
- 迭代器指针不引用第一个元素
- "strong"迭代器指针/引用
- c++ 如何将迭代器指针传递给通过引用需要对象的函数
- 泛型迭代器/指针初始化
- 断言模板实参是一个迭代器/指针
- 将输入迭代器(指针)复制到vector