2015-03-31 2 views
1

Est-il légal d'effacer un élément d'un ensemble tout en for_each sur l'ensemble, tant que vous ne supprimez pas l'élément actuel?C++ Effacer un élément de l'ensemble pendant for_each

L'effacement d'ensemble conserve tous les itérateurs sauf celui en cours d'effacement.

Par exemple:

set<int> nums{0, 1, 2, 3, 4}; 

void weird_remove(int x) { 
    int randnum = rand() % 5; 
    if (randnum != x) { 
     nums.erase(randnum); 
    } 
} 

int main() { 
    for_each(nums.begin(), nums.end(), weird_remove); 
} 

aussi que diriez-vous au cours de plage pour les boucles?

Et je suppose que les réponses s'appliquent à la carte ainsi qu'à l'ensemble.

Répondre

2

Question:

Est-il légal d'effacer un élément d'une set tout en faisant for_each sur la set, tant que vous ne supprimez pas l'élément en cours?

Oui, c'est légal.

De http://en.cppreference.com/w/cpp/container/set/erase:

size_type erase(const key_type& key); (3)

Supprime spécifié des éléments du récipient.
3) Supprime tous les éléments avec la clé de valeur de clé.

Les références et les itérateurs des éléments effacés sont invalidés. Les autres références et itérateurs ne sont pas affectés.