Поиск переменной из вектора объектов
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
}
}