J'essayais d'effacer une gamme d'éléments de la carte en fonction de conditions particulières. Comment le faire en utilisant les algorithmes STL?
Au départ j'ai pensé à utiliser remove_if
mais ce n'est pas possible car remove_if ne fonctionne pas pour les conteneurs associatifs.
Existe-t-il un algorithme équivalent "remove_if" qui fonctionne pour la carte?
En guise d'option simple, j'ai pensé à parcourir la carte et à effacer. Mais est-ce que faire une boucle sur la carte et effacer une option sûre? (Car les itérateurs deviennent invalides après l'effacement)
J'ai utilisé l'exemple suivant:
bool predicate(const std::pair<int,std::string>& x)
{
return x.first > 2;
}
int main(void)
{
std::map<int, std::string> aMap;
aMap[2] = "two";
aMap[3] = "three";
aMap[4] = "four";
aMap[5] = "five";
aMap[6] = "six";
// does not work, an error
// std::remove_if(aMap.begin(), aMap.end(), predicate);
std::map<int, std::string>::iterator iter = aMap.begin();
std::map<int, std::string>::iterator endIter = aMap.end();
for(; iter != endIter; ++iter)
{
if(Some Condition)
{
// is it safe ?
aMap.erase(iter++);
}
}
return 0;
}
for(auto iter=aMap.begin(); iter!=aMap.end(); ){ ....}
pour réduire l'encombrement. Le repos est comme d'autres l'ont dit. Cette question m'a évité de me fendre les cheveux pour le moment ;-)