C++ C++;移除对象向量上的_
我有一个对象的向量(顺序很重要)(让我们称它们为myobj类),我试图一次删除多个对象C++ C++;移除对象向量上的_,c++,vector,stl,predicate,C++,Vector,Stl,Predicate,我有一个对象的向量(顺序很重要)(让我们称它们为myobj类),我试图一次删除多个对象 class vectorList { vector<*myobj> myList; }; class myobj { char* myName; int index; bool m_bMarkedDelete; } 类向量列表 { 矢量糜棱岩; }; myobj类 { char*myName; 整数指数; 布尔·穆布马克德莱特; } 我在想,最好的方法是
class vectorList
{
vector<*myobj> myList;
};
class myobj
{
char* myName;
int index;
bool m_bMarkedDelete;
}
类向量列表
{
矢量糜棱岩;
};
myobj类
{
char*myName;
整数指数;
布尔·穆布马克德莱特;
}
我在想,最好的方法是标记特定的myobj对象进行删除,然后在向量上调用myList.remove_if()。但是,我不确定如何使用谓词之类的。我是否应该在对象中创建一个成员变量,允许我说我要删除myobj,然后创建一个谓词来检查是否设置了成员变量
如何将谓词作为vectorList类的一部分实现?谓词基本上是一种条件比较。它可以是函数或对象。下面是一个使用新C++ LAMBDAS的例子。此代码将遍历向量并删除等于3的值
int arg[6] = {1, 2, 3, 3, 3, 5};
std::vector<int> vec(arg, arg+6);
vec.erase(
std::remove_if(
vec.begin(), vec.end(),
[](int i){ return i == 3;}),
vec.end());
我应该在对象中创建一个成员变量吗
我想删除myobj,然后创建一个谓词
检查是否设置了成员变量
你不是已经做了吗?这难道不是《代码》的目的吗?您可以这样编写谓词:
bool IsMarkedToDelete(const myobj & o)
{
return o.m_bMarkedDelete;
}
然后:
或者,使用lambdas:
myList.erase(
std::remove_if(myList.begin(), myList.end(),
[](const myobj & o) { return o.m_bMarkedDelete; }),
myList.end());
如果你的类实际上没有这个成员,而你问我们是否应该,那么我会说没有。你用什么标准决定将其标记为删除?在谓词中使用相同的条件,例如:
bool IndexGreaterThanTen(const myobj & o)
{
return o.index > 10;
}
注意——我编写的函数当然是无效的,因为您的所有成员都是私有的。因此,您需要某种方法来访问它们。如果向量是myobj*指针的列表,我该怎么做?这是我感到困惑的事情之一。这在VS 2008中有效吗?谢谢我得到以下错误,因为它是一个指针:错误C2662:“myobj::IsMarkedToDelete”:无法将“this”指针从“const myobj”转换为“myobj&”。我把它标记为删除,因为我是从一个类中做的,这个类有一个与我的向量同步的网格。我必须删除网格中的行,然后删除向量中相应的选定行。@Jordan:它不应该是成员,它应该是自由函数。IsMarkedToDelete应该是自由函数吗?问题似乎在于物体的“常数”…@Jordan:这是关于
这个指针。此
指针不应存在,因为此函数不应该是成员。IsMarkedToDelete应该是静态函数,它可能不相关,但std::list保留顺序,并有自己的remove\u if函数,该函数速度快得多,不需要单独擦除。@Ant:list::remove\u if
比向量上的remove and erase快吗?在什么情况下?在我做过的许多合理的测试中,情况肯定不是这样。不要仅仅因为擦除是列表的一个固定时间操作,就认为它会更快。std::vector
的连续性和随机访问保证为它购买了大量的性能。
myList.erase(
std::remove_if(myList.begin(), myList.end(),
[](const myobj & o) { return o.m_bMarkedDelete; }),
myList.end());
bool IndexGreaterThanTen(const myobj & o)
{
return o.index > 10;
}