我有一个 slotAndId 结构的结构,它是这样声明的

typedef struct {
    int slot;
    int id;
} slotAndId;

然后我有一个 vector ,其中包含许多 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);
}

例如,如果我想找到一个 slotAndId 对象,该对象在 vector 中的插槽等于 20,我将如何在 C++98 中做到这一点?我如何才能从 vector 中删除该特定的 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 没有 lambdas,但我们可以通过使用仿函数来使它更灵活:
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
    );
}

现在这个逻辑可以用不同的参数重复使用。

或者只是有一个循环!

如果您的容器非常大,您可能会考虑使用不同的(或附加的)数据结构,它可以在比线性时间更好的时间内完成此任务。

关于c++ - 如何查找/删除具有特定参数的结构 vector 元素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56426627/

10-11 23:06
查看更多