这是我第一次使用列表 STL,我不确定我正在尝试做的事情是否可行。 我有一个包含 class_A 列表的 class_B,我需要 class_B 中的一个函数,它接受一个 ID,在列表中搜索具有相同 ID 的实例,并从列表中获取指向该列表中实例的指针:
bool class_B::get_pointer(int ID,class_A* pointer2A){
list<class_A>::iterator i;
for(i=class_A.begin();i!=class_A.end();i++){
if((*i).get_id()==ID) {
\\pointer2A=(i);<---------------this is what I'm trying to do
return true;
}
}
pointer2A=NULL;
return false;
}
我如何执行此操作,是否可以从迭代器转换为实例?
编辑:
我在多线程程序中使用此函数,但我无法将迭代器返回给调用函数,因为另一个线程可能会删除列表中的一个元素。
现在我有一个指向我的元素的指针(假设它被锁定,所以它不能被删除),并且另一个线程删除了另一个元素并对列表执行排序,指针会发生什么我'我拿着? (我不知道列表是如何重新排列元素的,是通过使用复制 c'tor 复制元素,还是通过其他方式来完成?)。
Useless答案对我来说最有帮助(非常感谢),是的,我应该使用对指针的引用,因为我打算更改它。
最佳答案
你应该这样写:
pointer2A= &*i;
此处 *i
返回对象,您可以通过在 &
前面添加地址来获取该对象:&*i
。
请注意,i
与 &*i
不同。请参阅此主题以获得更一般的讨论:
无论如何,我建议您将指针本身解读为:
class_A* class_B::get_pointer(int ID)
{
//I assume the name of the list is objA, not class_A
for(list<class_A>::iterator i=objA.begin();i!=objA.end();i++)
{
if( i->get_id()==ID)
{
return &*i;
}
}
return NULL; //or nullptr in C++11
}
或者,在 C++11 中,您可以将 std::find_if
用作:
auto it = std::find_if(objA.begin(),
objA.end(),
[&](class_A const &a){ return a->get_id() == ID;});
classA *ptr = NULL;
if ( it != objA.end())
ptr = &*it; //get the pointer from iterator
确保 get_id
是一个 const
成员函数。
关于c++ - 如何将列表 STL 的迭代器转换为实例 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10821607/