gpt4 book ai didi

c++ - 如何将列表 STL 的迭代器转换为实例 (C++)

转载 作者:太空狗 更新时间:2023-10-29 23:33:42 25 4
gpt4 key购买 nike

这是我第一次使用列表 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com