web-dev-qa-db-fra.com

Comment rechercher un élément dans une liste stl?

Existe-t-il une fonction find() pour la liste comme dans le vecteur?

Y at-il un moyen de faire cela dans la liste?

40
Prasanth Madhavan

Tu utilises std::find de <algorithm>, qui fonctionne aussi bien pour std::list et std::vector. std::vector n'a pas sa propre fonction de recherche/recherche.

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

Notez que cela fonctionne pour les types intégrés comme int ainsi que pour les types de bibliothèque standard comme std::string _ par défaut car ils ont operator== prévu pour eux. Si vous utilisez std::find sur un conteneur de type défini par l'utilisateur, vous devez surcharger operator== autoriser std::find pour fonctionner correctement: EqualityComparable concept

88
wkl

Non, pas directement dans le modèle std :: list lui-même. Vous pouvez cependant utiliser l'algorithme std :: find comme ça:

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()
18
Jan Holecek

Outre l’utilisation de std :: find (à partir de l’algorithme), vous pouvez également utiliser std :: find_if (qui est mieux que l’OMI alors que std :: find), ou un autre algorithme de recherche provenant de cette liste


#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;
    }
}
7
BЈовић

Ce que vous pouvez faire et ce que vous devriez faire sont des questions différentes.

Si la liste est très courte ou si vous n’appelez une recherche une fois, utilisez l’approche linéaire ci-dessus.

Cependant, la recherche linéaire est l’un des plus grands maux que je trouve dans le code lent, et envisagez d’utiliser une collection ordonnée (définie ou multiset si vous autorisez les doublons). Si vous devez conserver une liste pour d'autres raisons, par exemple en utilisant une technique LRU ou si vous devez conserver l'ordre d'insertion ou un autre ordre, créez un index pour celle-ci. Vous pouvez réellement le faire en utilisant un std :: set des itérateurs de liste (ou multiset) bien que vous ayez besoin de le maintenir chaque fois que votre liste est modifiée.

3
CashCow

Oui, la méthode find () est présente dans la liste STL. juste utiliser

    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;
0
Praveen Kumar