Поиск переменной из вектора объектов

struct ABC
{
int a;
string b;
};

У меня есть вектор объектов в вышеупомянутой структуре. И хотите найти вектор на основе переменной "b"?

У меня есть логика, как показано ниже.

vector<ABC> vec = ...;//vec has my objects
for(vector<ABC>::iterator it = vec.begin();
        it != vec.end();
        ++it)
    {
        if(search_str == (it->b))//search string is my string which i need to search
        {
        }
    }

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

3 ответа

Решение

Простой, читаемый, взятый из комментария Сэма:

auto found = std::find_if(vec.begin(), vec.end(), [&](auto const &e) {
    return e.b == search_str;
});

И сейчас found является итератором первого соответствующего элемента, или vec.end() если ничего не было найдено.

Вы также можете использовать диапазон, основанный на циклах, в некоторых случаях, чтобы дать вам более четкий код.

for (auto const &p : vec)
{
    if (p == search_str)
    {
        //--- Handle the find ---//

        //if you want to stop...
        break; 
    }
}

Один из лучших методов сравнения двух строк - использование compare метод в C++.

Предположим, вы хотите сравнить две строки S1 и S2.
Ты можешь использовать equality operator( == ) как вы уже использовали.

Но используя std::string::compare() Функция имеет свою выгоду.
Мы можем не только сравнить две строки, но и проверить, одна из них меньше или больше.

std::string::compare() функция возвращает int:

  • ноль, если S1 равно S2,
  • меньше нуля, если S1 меньше чем S2,
  • больше нуля, если S1 больше, чем S2,

Таким образом, ваш код может быть отформатирован как:

vector<ABC> vec = ...;//vec has my objects
for(vector<ABC>::iterator it = vec.begin(); it != vec.end(); ++it){
    if(!search_str.compare(it->b))
    {
      //match found
    }
}
Другие вопросы по тегам