Как найти / удалить элемент вектора структуры с конкретным параметром? - PullRequest
3 голосов
/ 03 июня 2019

У меня есть структура 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 Ответ

4 голосов
/ 03 июня 2019

Для этого 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 нет лямбд, но мы можем сделать ее более гибкой, используя вместо этого функтор:

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

Теперь эта логика может использоваться повторно с другими параметрами.

В качестве альтернативы просто есть цикл!

Если ваш контейнер очень большой, вы можете рассмотреть другую (или дополнительную) структуру данных, которая может сделать это лучше, чем линейное время.

...