sla*_*ton 7 c++ pointers iterator
在我的班上,我有两个私人成员:
std::list<MyObject> objects;
MyObject *selecteObj;
Run Code Online (Sandbox Code Playgroud)
当一个事件发生时,我想遍历列表并运行某种测试,只会在列表中的一个项目上产生true.我想保存一个指向该项目的指针,以便在别处使用.
std::list<MyObject>::iterator i;
for (i = objects.begin(); i!=objects.end(); ++i){
if (i->test())
selectedObj = i;
}
Run Code Online (Sandbox Code Playgroud)
在其他地方另一种方法
if (selectedObj !=null)
tmpObj->doSomething();
Run Code Online (Sandbox Code Playgroud)
但是这不起作用,因为i它不是指针,它是一个迭代器,即使你可以像对待指针一样对待它MyObject.
是否可以检索迭代器内部存储的指针以供在别处使用?
我错误地想到了这个吗?
完成我想要做的事情的正确方法是什么?
fre*_*low 15
是否可以检索迭代器内部存储的指针以供在别处使用?
当然,只需取消引用迭代器,*然后通过&以下方式获取指向对象的指针:
selectedObj = &*i;
Run Code Online (Sandbox Code Playgroud)
在一个侧面说明,你记得初始化selectedObj与NULL循环之前?
是否可以检索迭代器内部存储的指针以供在别处使用?
是.正如@FredOverflow所说,做到这一点:
selectedObj = &*i;
Run Code Online (Sandbox Code Playgroud)
但是,如果您可以使用C++ 11的功能,那么您可以使用基于范围的 for循环来编写更好的语法:
MyObject *selectedObj = NULL;
for (MyObject & obj : objects)
{
if (obj.test())
selectedObj = &obj; //store the address
}
Run Code Online (Sandbox Code Playgroud)
看起来更好?不需要迭代器和编写语法&*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;
}
Run Code Online (Sandbox Code Playgroud)
代码取自:std :: addressof
| 归档时间: |
|
| 查看次数: |
8109 次 |
| 最近记录: |