Question Comment savoir si un élément est présent dans un fichier std :: vector?


Tout ce que je veux faire est de vérifier si un élément existe ou non dans le vecteur, donc je peux traiter chaque cas.

if ( item_present )
   do_this();
else
   do_that();

503
2018-02-20 21:58


origine


Réponses:


Vous pouvez utiliser std::find de <algorithm>:

std::find(vector.begin(), vector.end(), item) != vector.end()

Cela renvoie un bool (true si présent, false autrement). Avec votre exemple:

#include <algorithm>

if ( std::find(vector.begin(), vector.end(), item) != vector.end() )
   do_this();
else
   do_that();

744
2018-02-20 22:00



Comme d'autres l'ont dit, utilisez la STL find ou find_if les fonctions. Mais si vous recherchez de très gros vecteurs et que cela a un impact sur les performances, vous pouvez trier votre vecteur, puis utiliser le binary_search, lower_bound, ou upper_bound algorithmes.


99
2018-02-20 22:26



Utilisez find dans l'en-tête de l'algorithme de stl.J'ai illustré son utilisation avec int type. Vous pouvez utiliser n'importe quel type que vous voulez aussi longtemps que vous pouvez comparer pour l'égalité (surcharge == si vous en avez besoin pour votre classe personnalisée).

#include <algorithm>
#include <vector>

using namespace std;
int main()
{   
    typedef vector<int> IntContainer;
    typedef IntContainer::iterator IntIterator;

    IntContainer vw;

    //...

    // find 5
    IntIterator i = find(vw.begin(), vw.end(), 5);

    if (i != vw.end()) {
        // found it
    } else {
        // doesn't exist
    }

    return 0;
}

43
2018-02-20 22:06



Si votre vecteur n'est pas commandé, utilisez l'approche suggérée par MSN:

if(std::find(vector.begin(), vector.end(), item)!=vector.end()){
      // Found the item
}

Si votre vecteur est commandé, utilisez la méthode binary_search Brian Neal a suggéré:

if(binary_search(vector.begin(), vector.end(), item)){
     // Found the item
}

La recherche binaire produit O (log n) le pire des cas, ce qui est beaucoup plus efficace que la première approche. Pour utiliser la recherche binaire, vous pouvez utiliser qsort pour trier le vecteur en premier pour garantir qu'il est commandé.


32
2017-11-23 08:58



J'utilise quelque chose comme ça ...

#include <algorithm>


template <typename T> 
const bool Contains( std::vector<T>& Vec, const T& Element ) 
{
    if (std::find(Vec.begin(), Vec.end(), Element) != Vec.end())
        return true;

    return false;
}

if (Contains(vector,item))
   blah
else
   blah

... de cette façon, c'est en fait clair et lisible. (Évidemment, vous pouvez réutiliser le modèle dans plusieurs endroits).


18
2017-09-04 16:34



N'oubliez pas que si vous faites beaucoup de recherches, il existe des conteneurs STL qui sont meilleurs pour cela. Je ne sais pas quelle est votre application, mais des conteneurs associatifs comme std :: map peuvent être utiles.

std :: vector est le conteneur de choix sauf si vous avez une raison pour une autre, et les recherches par valeur peuvent être une telle raison.


9
2018-02-20 22:42



En C ++ 11, vous pouvez utiliser any_of. Par exemple si c'est un vector<string> v; puis:

if (any_of(v.begin(), v.end(), bind2nd(equal_to<string>(), item)))
   do_this();
else
   do_that();

8
2017-08-11 04:15



Utilisez la STL trouver fonction.

Gardez à l'esprit qu'il y a aussi un find_if function, que vous pouvez utiliser si votre recherche est plus complexe, c’est-à-dire si vous ne cherchez pas seulement un élément, mais si vous voulez, par exemple, voir si un élément remplit une certaine condition, par exemple une chaîne qui démarre avec "abc". (find_if vous donnerait un itérateur qui pointe vers le premier élément de ce type).


7
2018-02-20 22:18



Vous pouvez essayer ce code:

#include <algorithm>
#include <vector>

// You can use class, struct or primitive data type for Item
struct Item {
    //Some fields
};
typedef std::vector<Item> ItemVector;
typedef ItemVector::iterator ItemIterator;
//...
ItemVector vtItem;
//... (init data for vtItem)
Item itemToFind;
//...

ItemIterator itemItr;
itemItr = std::find(vtItem.begin(), vtItem.end(), itemToFind);
if (itemItr != vtItem.end()) {
    // Item found
    // doThis()
}
else {
    // Item not found
    // doThat()
}

5
2018-04-28 15:29