Подтвердить что ты не робот

Как найти элемент в списке stl?

Есть ли функция find() для списка, как в векторе?

Есть ли способ сделать это в списке?

4b9b3361

Ответ 1

Вы используете std::find от <algorithm>, который одинаково хорошо работает для std::list и std::vector. std::vector не имеет собственной функции поиска/поиска.

#include <list>
#include <algorithm>

int main()
{
    std::list<int> ilist;
    ilist.push_back(1);
    ilist.push_back(2);
    ilist.push_back(3);

    std::list<int>::iterator findIter = std::find(ilist.begin(), ilist.end(), 1);
}

Обратите внимание, что это работает для встроенных типов, таких как int, а также стандартных типов библиотек, таких как std::string, потому что для них есть operator==. Если вы используете std::find в контейнере пользовательского типа, вы должны перегрузить operator==, чтобы позволить std::find работать правильно: EqualityComparable концепция

Ответ 2

Нет, не непосредственно в шаблоне std:: list. Однако вы можете использовать алгоритм std:: find следующим образом:

std::list<int> my_list;
//...
int some_value = 12;
std::list<int>::iterator iter = std::find (my_list.begin(), my_list.end(), some_value);
// now variable iter either represents valid iterator pointing to the found element,
// or it will be equal to my_list.end()

Ответ 3

Кроме использования std:: find (из алгоритма), вы также можете использовать std:: find_if (это ИМО лучше, чем std:: find) или другой алгоритм поиска из этот список


#include <list>
#include <algorithm>
#include <iostream>

int main()
{
    std::list<int> myList{ 5, 19, 34, 3, 33 };


    auto it = std::find_if( std::begin( myList ),
                            std::end( myList ),
                            [&]( const int v ){ return 0 == ( v % 17 ); } );

    if ( myList.end() == it )
    {
        std::cout << "item not found" << std::endl;
    }
    else
    {
        const int pos = std::distance( myList.begin(), it ) + 1;
        std::cout << "item divisible by 17 found at position " << pos << std::endl;
    }
}

Ответ 4

Что вы можете делать, и что вы должны делать, это разные вопросы.

Если список очень короткий, или вы когда-либо будете называть один раз, то используйте линейный подход выше.

Однако линейный поиск - одно из самых больших явлений, которое я нахожу в медленном коде, и рассмотрю возможность использования упорядоченного набора (set или multiset, если вы разрешаете дубликаты). Если вам нужно вести список по другим причинам, например, используя технику LRU или вам нужно поддерживать порядок вставки или какой-либо другой порядок, создайте для него индекс. Вы действительно можете это сделать, используя std:: set итераторов списка (или мультимножество), хотя вам нужно поддерживать это в любое время, когда ваш список будет изменен.