删除矢量中的对象
Deleting an object in a vector
我正在尝试删除对象向量中的一个元素。向量中充满了Object
的实例,在某个时刻,我想删除向量中的某个元素,而不是通过索引,而是通过元素本身。
一个简单的例子是:
std::vector< string > strVector;
strVector.push_back( "abc" );
strVector.push_back( "def" );
strVector.push_back( "ghi" ); // So strVector should contain "abc", "def", and "ghi"
如何从矢量中删除"ghi"?请注意,我不知道"ghi"在那个向量中的位置。
// Something like this. Assume strVector = [ "abc", "cba", "ccb", "bac", "aaa" ]
strVector.removeElement( "ccb" );
我正在研究的一个更相关的例子:
class MyClass {
std::vector< Object > myObjVector;
void main( ARGS ) {
for ( int i = 0; i < 10; i++ ) {
Object myObject = Object( );
myObjVector.push_back( myObject );
}
int j = getANumber( ); // j could be any number within the size of the vector
Object myOtherObject = myObjectVector.at( j );
// How do I erase myOtherObject (which is an object inside the vector) ?
removeFromVector( myOtherObject );
}
}
我希望问题很清楚。提前谢谢。
编辑:我明白了,感谢所有回答的人。诀窍是给类一些唯一的东西来识别它(比如名称或标记,只要它们保证是唯一的),然后使用擦除-删除习惯用法从数组中删除对象。
如果您的用例没有重复,那么您最好使用std::set
,并使用std::set::erase,它取一个值。
std::set< string > strSet;
strSet.insert( "abc" );
strSet.insert( "def" );
strSet.insert( "ghi" );
strSet.insert( "ccb" );
strSet.erase("ccb");
如果您需要处理重复项,则必须指定所需的删除行为。它应该删除与某个值匹配的一个或全部元素吗?你关心保留其余元素的顺序吗?如果你需要使用一个向量,那么请使用擦除-删除习惯用法。但请注意,std::vector::erase
具有线性时间复杂度,而std::set::erase
的相关变体具有对数时间复杂度。擦除-删除将删除所有等于给定值的元素。
注意:如果要将std::set
用于用户定义的类型,则必须提供小于bool operator<(const UserType&) const
的函数或函子,以实现严格的弱排序。
如果必须使用vector
,则使用erase(remove())
:
#include <algorithm>
#include <string>
#include <vector>
strVector.erase(std::remove(strVector.begin(), strVector.end(), "ghi"),
strVector.end());
这将从CCD_ 10中移除CCD_ 9的所有实例。
如果向量中的对象支持相等,这就是条件要删除,则可以使用:
v.erase( std::remove( v.begin(), v.end(), "ghi" ), v.end() );
否则,您将需要remove_if
,它带有一个函数对象(或lambda,如果您有C++11),如果要删除元素,则返回true。
#include <iostream>
#include <vector>
class Object
{
public:
Object(int n){secret_num = n;}
virtual ~Object(){}
int getSecretNum(){return secret_num;}
private:
int secret_num;
};
int main()
{
int index= -1;
Object *urobj = new Object(104);
std::vector<Object*> urvector;
for(int i = 0; i < 10; ++i)
{
Object *obj = new Object(i+1);
urvector.push_back(obj);
}
urvector.push_back(urobj);
for(int j = 0; j < urvector.size(); ++j)
{
Object *tmp = urvector.at(j);
std::cout << tmp->getSecretNum() << std::endl;
if(urobj == tmp)
index = j;
}
if(index == -1)
std::cout << " not match " << std::endl;
else
std::cout << " match " << index << std::endl;
return 0;
}
相关文章:
- 线程调用的函数对对象删除是否安全?
- 当我使用dynamic_cast并删除对象删除时,析构函数是如何工作的?
- 使用 com 对象删除计划任务
- C 将对象删除为参考
- C样式对象删除的包装器
- 静态映射中动态分配的对象.删除必要的
- C++指向对象删除的指针数组,"Debug assertion failure!"
- 在其成员函数返回之前,将对象删除是不确定的行为吗?
- Python 对象删除检测
- C++安全对象删除
- Qt:RemoveWidget和对象删除
- Qt对象删除导致崩溃
- 删除由两个shared_pointer实例管理的对象(删除其中一个)
- 顶点缓冲区对象(删除进程)opengl
- 设计 -- 按名称或对象删除
- 提升中的异常:进程间,共享内存对象删除
- 使用std::function和std::bind来存储回调并处理对象删除
- 如何使用智能指针防止双重对象删除
- 指针指向对象删除时自动为空
- 对象层次结构中的对象删除责任