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

标签 c++ list stl

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

相关文章:

java - java中如何从列表中随机选取一个字符串?

c++ - 迭代 vector 无限迭代

c++ - vector 中元素范围的迭代器,其属性具有特定值

c++ - 容器前后行为

list - 如何在保留顺序并在 dart 中返回列表的同时删除列表中的重复构造对象?

c++ - 相同类型之间的无效转换

C++在字符串中查找重复的子字符串

c++ - linux内核模块链接器警告: "*** Warning: <function> [<module>] undefined!" - any way to get rid of them?

Java 基础 : create class object

Java对动态定义的对象数组列表进行排序