如何查找/删除具有特定参数的struct向量的元素?

时间:2019-06-03 11:43:27

标签: c++ c++98

我有一个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);
}

例如,如果我想查找例如,向量中有一个slotAndId对象,其插槽等于20,我该如何在C ++ 98中做到这一点?然后如何从向量中删除特定的slotAndId对象?

1 个答案:

答案 0 :(得分:4)

这就是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,但是我们可以改用functor使其更灵活:

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
    );
}

现在,此逻辑可以在不同的参数下重复使用。

或者只是循环!

如果您的容器非常大,则可以考虑使用其他(或附加)数据结构,该结构可以比线性时间更好。