Ik heb een lijst met elementen, laten we zeggen gehele getallen, en ik wil controleren of mijn variabele (een ander geheel getal) een van de elementen uit de lijst is. In python zou ik doen:
my_list = [1,2,3,4] # elements
my_var = 3 # my variable
my_var in my_list # returns boolean
Hoe doe je dat in C++? Ik dacht eraan om std::list
te gebruiken, maar ik kan er geen find
-methode in vinden. Ik kan een dergelijke methode zien in de structuur std::set
.
Meer diepgaand is het probleem dat mijn programma een aantal unieke id’s krijgt (een lijst, een set, wat dan ook) en ik herhaal een lange lijst met invoergegevens (id’s) en controleer of ze in de lijst zijn opgenomen (boolean waarde geretourneerd voor elke iteratiestap). En ik weet niet zeker hoe ik dat in C++ moet doen.
Antwoord 1, autoriteit 100%
U kunt std::find
. gebruiken
bool found = (std::find(my_list.begin(), my_list.end(), my_var) != my_list.end());
Je moet <algorithm>
opnemen. Het zou moeten werken op standaardcontainers, vectorlijsten, enz…
Antwoord 2, autoriteit 31%
std::list
biedt geen zoekmethode. U kunt de lijst herhalen en controleren of het element bestaat of std::find
gebruiken. Maar ik denk dat voor jouw situatie std::set
meer de voorkeur heeft. De eerste zal O(n)
tijd kosten, maar later zal O(lg(n))
tijd nodig hebben om te zoeken.
U kunt eenvoudig het volgende gebruiken:
int my_var = 3;
std::set<int> mySet {1, 2, 3, 4};
if(mySet.find(myVar) != mySet.end()){
//do whatever
}
Antwoord 3, autoriteit 9%
je moet #include <algorithm>
, dan kun je std::vinden
Antwoord 4, autoriteit 7%
Ze zouden echt een wikkel moeten toevoegen. Zoals dit:
namespace std
{
template<class _container,
class _Ty> inline
bool contains(_container _C, const _Ty& _Val)
{return std::find(_C.begin(), _C.end(), _Val) != _C.end(); }
};
...
if( std::contains(my_container, what_to_find) )
{
}
Antwoord 5, autoriteit 3%
Een one-liner-oplossing, vergelijkbaar met python, is (std::set<int> {1, 2, 3, 4}).count(my_var) > 0
.
Minimaal werkvoorbeeld
int my_var = 3;
bool myVarIn = (std::set<int> {1, 2, 3, 4}).count(my_var) > 0;
std::cout << std::boolalpha << myVarIn << std::endl;
drukt true
of false
af, afhankelijk van de waarde van my_var.
Antwoord 6
Gebruik std::find
, zoiets als:
if (std::find(std::begin(my_list), std::end(my_list), my_var) != std::end(my_list))
// my_list has my_var
Antwoord 7
Verklaar aanvullende helperfunctie als volgt:
template <class T, class I >
bool vectorContains(const vector<T>& v, I& t)
{
bool found = (std::find(v.begin(), v.end(), t) != v.end());
return found;
}
En gebruik het als volgt:
void Project::AddPlatform(const char* platform)
{
if (!vectorContains(platforms, platform))
platforms.push_back(platform);
}
Momentopname van een voorbeeld vindt u hier: