1

我有一个std::vector保存所有对象并在每一帧中传递给它们的对象,以便每个对象都可以访问其他对象。我的问题是对象如何从向量中删除自己?

这不起作用:

vector.erase(this);

有没有其他解决方案?

4

5 回答 5

8

erase需要一个迭代器。this是成员函数/类定义中可用的指针。此外,erase需要在实例上调用vector-- 你不能使用vector.erase.

对象不能自行删除。您将需要传递一个迭代器。您可以使用std::find来查找对象是否存在于向量中,然后将其传递。

于 2012-06-16T17:58:30.473 回答
4

您需要通过访问它的迭代器来删除元素,这可以通过 来完成std::find,或者如果您知道索引(不太复杂),可以通过:

vector.begin() + indexOfElement

以便您可以删除它:

vector<Type>::iterator it = yourVector.begin() + index;
yourVector.erase(it);

请注意,由于向量以数组格式存储其数据,这会导致您要删除的元素之后的所有元素都向左移动(这很昂贵)std::list如果您不需要随机访问,请考虑使用 a 。

于 2012-06-16T17:59:06.693 回答
1

或者,您可以使用 set 并使用 set.erase(this)

于 2012-06-16T18:10:38.400 回答
1

如前所述,您可以使用 std::find (http://www.cplusplus.com/reference/algorithm/find/)如果我没记错的话,这需要您重载 == 运算符。

例如

std::vector<YourObjectType>::iterator it = find(yourVector.begin(), yourVector.end(), referenceToObject);

bool operator == (const YourObjectType* object) {return object == this; }

然后你就用yourVector.erase(it);

于 2012-06-16T18:33:58.407 回答
1

你可以这样做:

vec.erase(vec.begin() + (this - &vec.front()));

如果您确定元素确实来自向量

于 2012-06-16T18:38:28.483 回答