C++ 获取元素在向量中的位置的索引

C++ 获取元素在向量中的位置的索引,c++,vector,C++,Vector,g++(GCC)4.7.2 我有下面的向量 vector<Observer> observers; 我将把大约10个观察者推到向量上。但是,我需要从向量中删除一个。但是,因为我不知道观察者在向量中的什么位置。我如何获得它所在位置的索引,以便使用该索引删除它 我将需要得到索引,以便我可以删除它使用擦除 observers.erase(observers.begin() + index); 非常感谢您的建议,应该可以做到这一点标准::查找(observer.begin(),obse

g++(GCC)4.7.2

我有下面的向量

vector<Observer> observers;
我将把大约10个观察者推到向量上。但是,我需要从向量中删除一个。但是,因为我不知道观察者在向量中的什么位置。我如何获得它所在位置的索引,以便使用该索引删除它

我将需要得到索引,以便我可以删除它使用擦除

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

非常感谢您的建议,

应该可以做到这一点<代码>标准::查找(observer.begin(),observer.end(),ob)

应该适用于此<代码>标准::查找(observer.begin(),observer.end(),ob)

您可以使用
std::find
但是您需要为您的Observer类重载equality
=
操作符,这样程序就知道如何比较对象了

您可以使用
std::find
但是您需要为Observer类重载equality
=
操作符,这样程序就知道如何比较对象了物体

真的那么难吗

inti=0;
while(i
(除了提到的
std::find
、迭代器和1000多个方法之外)

真的那么难吗

inti=0;
while(i
(除了前面提到的
std::find
、迭代器和1000多个方法之外)

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

std::vector::iterator-toErase;
//选择以下选项之一
toErase=std::find_if(observators.begin(),observators.end(),/*此处的谓词*/);
toErase=std::find(observer.begin()、observer.end()、observer-todelete);
//如果我们找到符合条件的观察者
if(toErase!=observators.end()){
观察者:擦除(toErase);
}
您可以使用其中一种算法(可能)。如果迭代器符合您的条件,它将向正确的元素返回迭代器,您可以直接将迭代器提供给
erase()

std::vector::iterator-toErase;
//选择以下选项之一
toErase=std::find_if(observators.begin(),observators.end(),/*此处的谓词*/);
toErase=std::find(observer.begin()、observer.end()、observer-todelete);
//如果我们找到符合条件的观察者
if(toErase!=observators.end()){
观察者:擦除(toErase);
}

如果你知道观察者的名字,也许你应该用它

如果你知道观察者的名字,也许你应该用它

你可以用“std::find”,但也许你根本不需要“vector”。也许你应该考虑使用“设置”容器代替。当索引不重要时,它是一个合适的替代方法。

您可以使用“std::find”来实现它,但可能根本不需要“vector”。也许你应该考虑使用“设置”容器代替。当指数不重要时,这是一个合理的选择。

您如何了解您的观察者?你是在使用迭代器还是什么?你可以使用
remove\u if
from
你是怎么知道你的观察者的?您是在使用迭代器还是什么?如果
中的
是指
运算符==
,您可以使用
remove\u。另外,另一种方法是使用
std::find_if
。您的意思是
操作符==
。另外,另一种方法是使用
std::find_if
。如果要传递谓词,则需要
std::find_if
。如果要传递谓词,则需要
std::find_if
。帖子中没有任何内容表明集合是合适的容器。我可能误解了这一点:“然而,因为我不知道观察者在向量中的什么位置“。如果对象更可能通过值而不是索引来识别,那么set是最佳选择。但是没有什么可以说序列必须是唯一的,或者需要基于节点的容器,或者类型具有自然顺序。我认为这是因为问题意味着每个观察者都有一个索引-这就是唯一性。”。好吧,我可能错了,这就是为什么我首先使用了“也许”这个词。帖子中没有任何东西表明集合是一个合适的容器。我可能会误解这一点:“但是,因为我不知道观察者在向量中的位置。”。如果对象更可能通过值而不是索引来识别,那么set是最佳选择。但是没有什么可以说序列必须是唯一的,或者需要一个基于节点的容器,或者类型具有自然顺序。我认为这是因为问题意味着每个观察者都有一个索引——这就是唯一性。嗯,我可能错了,这就是为什么我一开始就用“也许”这个词。
observers.erase(observers.begin() + index); 
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::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);
}