如何 find/remove 具有特定参数的结构向量的元素?
How to find/remove an element of vector of struct with specific parameter?
我有一个 slotAndId 结构,它是这样声明的
typedef struct {
int slot;
int id;
} slotAndId;
然后我有一个向量,其中包含许多类型为 slotAndId 的对象...
slotAndId object;
vector<slotAndId> ids;
for (int i = 0; i < 20; i++) {
object.slot = i;
object.id = i + 2000; //random id as example, this will be generated by something else in reality.
ids.push_back(object);
}
如果然后我想查找,例如,如果向量中有一个槽等于 20 的 slotAndId 对象,我将如何在 C++98 中执行此操作?我怎样才能从向量中删除那个特定的 slotAndId 对象?
这就是 std::find_if
的用途。
bool HasSlot20(const slotAndId& item)
{
return item.slot == 20;
}
int main()
{
std::vector<slotAndId> ids = {..};
std::vector<slotAndId>::const_iterator it = std::find_if(
ids.begin(),
ids.end(),
HasSlot20
);
}
我们需要额外的函数,因为 C++98 没有 lambda,但我们可以通过使用仿函数来使其更加灵活:
struct HasSlot
{
HasSlot(const int id) : m_id(id) {}
bool operator()(const slotAndId& item)
{
return item.slot == m_id;
}
private:
const int m_id;
};
int main()
{
std::vector<slotAndId> ids = {..};
std::vector<slotAndId>::const_iterator it = std::find_if(
ids.begin(),
ids.end(),
HasSlot(20)
);
}
或:
int main()
{
HasSlot finder(20);
std::vector<slotAndId> ids = {..};
std::vector<slotAndId>::const_iterator it = std::find_if(
ids.begin(),
ids.end(),
finder
);
}
现在这个逻辑是 re-usable 具有不同的参数。
或者只是有一个循环!
如果您的容器非常大,您可能会考虑一种不同的(或额外的)数据结构,它可以在比线性时间更好的时间内完成此操作。
我有一个 slotAndId 结构,它是这样声明的
typedef struct {
int slot;
int id;
} slotAndId;
然后我有一个向量,其中包含许多类型为 slotAndId 的对象...
slotAndId object;
vector<slotAndId> ids;
for (int i = 0; i < 20; i++) {
object.slot = i;
object.id = i + 2000; //random id as example, this will be generated by something else in reality.
ids.push_back(object);
}
如果然后我想查找,例如,如果向量中有一个槽等于 20 的 slotAndId 对象,我将如何在 C++98 中执行此操作?我怎样才能从向量中删除那个特定的 slotAndId 对象?
这就是 std::find_if
的用途。
bool HasSlot20(const slotAndId& item)
{
return item.slot == 20;
}
int main()
{
std::vector<slotAndId> ids = {..};
std::vector<slotAndId>::const_iterator it = std::find_if(
ids.begin(),
ids.end(),
HasSlot20
);
}
我们需要额外的函数,因为 C++98 没有 lambda,但我们可以通过使用仿函数来使其更加灵活:
struct HasSlot
{
HasSlot(const int id) : m_id(id) {}
bool operator()(const slotAndId& item)
{
return item.slot == m_id;
}
private:
const int m_id;
};
int main()
{
std::vector<slotAndId> ids = {..};
std::vector<slotAndId>::const_iterator it = std::find_if(
ids.begin(),
ids.end(),
HasSlot(20)
);
}
或:
int main()
{
HasSlot finder(20);
std::vector<slotAndId> ids = {..};
std::vector<slotAndId>::const_iterator it = std::find_if(
ids.begin(),
ids.end(),
finder
);
}
现在这个逻辑是 re-usable 具有不同的参数。
或者只是有一个循环!
如果您的容器非常大,您可能会考虑一种不同的(或额外的)数据结构,它可以在比线性时间更好的时间内完成此操作。