STL 链表::如何访问成员
STL linked list:: how to access members?
如果我有一个包含指向类的指针的 STL 列表,并且想要访问类成员,我将如何去做?具体来说,我需要能够删除列表的成员,每个成员都有一个具有唯一 ID 的成员。
所以我有这样的东西:
class Actor{
private:
int id;
public:
int getActorID(){ return id;};
};
std::list<Actor *> actorList;
std::list<Actor *>::iterator i;
因此,如果每个 Actor 都有一个唯一的 ID,如何删除具有特定 ID 的 actor?我一直在使用手工编码的链表,但我想将其切换到 STL。唯一的问题是我无法弄清楚如何访问方法getActorID()以找到要删除的节点。感谢您的任何帮助。
std::list<Actor *>::iterator it;
std::list<Actor *>::iterator iStart = actorList.begin() ;
std::list<Actor *>::iterator iEnd = actorList.end() ;
for (it=iStart ;it!=iEnd;++it)
{
if (*it->getActorId() == searchedId)
{
actorList.erase(it);
break; //you have unique id's so you could delete a maximum 1 item
}
}
也不要忘记你还有其他选择,比如
std::list::remove
std::list::remove_if
http://en.cppreference.com/w/cpp/container/list/remove
迭代器的作用类似于指针,因此为了调用在 STL 容器中作为指针存储的对象的成员函数,您需要取消引用两次:
std::list<Actor*>::iterator iter = actorList.begin();
(*iter)->getActorId();
或:
(**iter).getActorId();
容器上的迭代器 for 循环可能会进行多次擦除,这是一场等待发生的灾难,因为擦除通常至少会使传递给它的迭代器(以及指向擦除元素的任何其他迭代器)无效,并且无效的迭代器无法安全地递增。 仅进行一次擦除调用的循环可以使用"break;"退出for循环,而无需使用无效的迭代器。
迭代器失效规则
正如我在这个问题导致的多个分段错误一周后告诉我的同事的那样,如果你想循环一个容器并调用 erase,请使用 while 循环并确保在调用 erase 之前获得对下一个项目(或 end())的有效迭代器。 执行此操作的最简单方法是在调用站点上递增迭代器。 对于 std::list::erase(迭代器),也可以将其返回值用作新的迭代器值。
列表迭代器不可递增
您必须使用迭代器,因为列表是顺序数据结构。拥有迭代器后,可以使用间接寻址运算符向前移动并提取指向对象的指针*
list<Actor *>::iterator it = actorList.begin();
Actor * innerPtr = *it;
innerPtr->yourMethod();
一旦你知道某个 actor 是要删除的,你可以使用方法erase(position);
使用迭代器:
if( innerPtr->getActorId() == <your condition> )
{
actorList.erase(it);
}
但是,如果您需要使用actor ID进行搜索,我建议您切换到不同的数据结构,例如关联容器(例如map)。
要找到要执行某些操作的节点,可以使用std::find_if()
:
#include <algorithm>
#include <list>
using namespace std;
class Actor{
private:
int id;
public:
int getActorID() const { return id;};
};
// a functor used for pre-C++11 since lambdas aren't supported
struct isActor
{
private:
int target;
public:
isActor( int target) : target(target) {}
bool operator()( Actor const* pa) const
{
return pa->getActorID() == target;
}
};
std::list<Actor *> actorList;
std::list<Actor *>::iterator i;
int main()
{
// pre-C++11 technique
i = std::find_if( actorList.begin(), actorList.end(), isActor(42));
// C++11 lambda technique
int id = 42;
i = std::find_if( begin(actorList), end(actorList), [=](Actor const* pa) {
return pa->getActorID() == id;
});
}
- C++ 传递指向对象的指针的指针,无法访问成员
- 从不同C++类的成员变量访问成员函数
- 使用 getter 访问成员变量C++
- 如何使用包含内部类的类实例有效地从内部类访问成员?
- 通过多个类访问成员时出错
- 如何在使用对象指针时访问成员函数
- 为什么相应成员不能正确访问成员函数指针
- 从两个不同类继承的非虚拟基类的访问成员
- 如何使用 gcc 内联汇编器代码访问成员变量
- 如何使用常数向量访问成员函数
- 访问成员函数中参数的类成员
- C++嵌套结构初始化和访问成员
- 通过指向班级第一个成员的指针访问成员是不确定的行为吗?
- 如何使用C STD :: SET中的迭代器访问成员功能
- 访问成员C 时,结构的向量生成了范围的错误
- 带指针的班级访问成员
- 从聚合类访问成员变量
- 如何访问成员变量 sqlite 回调
- ctypes/C++segfault访问成员变量
- 通过父类型的指针或直接从派生类访问成员函数的差异