1

g++ (GCC) 4.7.2

我有以下向量

vector<Observer> observers;

我将使用这个推动向量:

observers.push_back(ob);

我会将大约 10 个观察者推到向量上。但是,我需要从向量中删除一个。但是,因为我不知道观察者在向量中的哪个位置。如何获取它所在位置的索引,以便可以使用该索引将其删除?

我需要获取索引,以便可以使用擦除将其删除

observers.erase(observers.begin() + index); 

非常感谢您的任何建议,

4

6 回答 6

4

您可以使用其中一种find算法(可能是find_if)。如果它符合您的条件,它将返回一个指向正确元素的迭代器,您可以直接将其提供给erase().

std::vector<Observer>::iterator toErase;
//Pick one of the following
toErase = std::find_if(observers.begin(), observers.end(),/*your predicate here*/);
toErase = std::find(observers.begin(), observers.end(), observerToDelete);

//If we found an observer matching the criteria
if(toErase != observers.end()){
    observers.erase(toErase);
}
于 2013-05-29T10:10:41.283 回答
3

您可以使用std::find但您需要==为您的 Observer 类重载相等运算符,以便程序知道如何比较您的对象

于 2013-05-29T10:08:55.240 回答
2

std::find应该为此工作。std::find(observers.begin(), observers.end(), ob)

于 2013-05-29T10:07:19.147 回答
0

真的那么难吗?

int i = 0;
while (i < observers.size() && observers[i] != observerToDelete)
    i++;
// Replace the != with any other way of comparing observers
// if needed

if (i < observers.size())
    // found

(除了提到std::find的,迭代器和1000多种方法)

于 2013-05-29T10:10:19.987 回答
0

如果你知道观察者的名字,也许你应该使用std:map

于 2013-05-29T10:11:30.327 回答
-1

您可以为此使用“std::find”,但也许您根本不需要“向量”。也许您应该考虑改用“set”容器。当指数不重要时,这是一个合理的选择。

于 2013-05-29T10:12:16.070 回答