Как искать элемент в списке stl? - PullRequest
39 голосов
/ 05 января 2011

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

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

Ответы [ 5 ]

86 голосов
/ 05 января 2011

Вы используете 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 concept

18 голосов
/ 05 января 2011

Нет, не непосредственно в самом шаблоне 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()
7 голосов
/ 05 января 2011

Помимо использования std :: find (из алгоритма), вы также можете использовать std :: find_if (что лучше IMO, чем 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;
    }
}
3 голосов
/ 05 января 2011

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

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

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

0 голосов
/ 03 октября 2018

Да, метод find () присутствует в списке STL.просто используйте

    std :: list < int > l;
    std :: list < int > :: iterator pos;

    l.push_back(1);
    l.push_back(2);
    l.push_back(3);
    l.push_back(4);
    l.push_back(5);
    l.push_back(6);

    int elem = 3;   
    pos = find(l.begin() , l.end() , elem);
    if(pos != l.end() )
        std :: cout << "Element is present. "<<std :: endl;
    else
        std :: cout << "Element is not present. "<<std :: endl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...