2017-05-15 1 views
-2

Je supprime conditionnellement les éléments d'une instance vectorielle (AVector) d'objets (AnObject s) en utilisant erase et remove_if.Est-ce que l'effacement des éléments d'un vecteur efface également tous les vecteurs membres présents dans les éléments?

Dans mon scénario, AnObject a un Anothervector (de Anotherobject s) comme l'une de ses variables membres. Je veux effacer n'importe quel AnObject qui a la taille Anothervector comme 0. Note: BVector est un autre vecteur de AnObject s. condition_1 est un prédicat.

// Copy elements from BVector to AVector based on a condition 
    for (int i = 0; i < BVector.size(); i++) 
      { 
       AnObject temp; 
       AVector.push_back(temp); 
       std::copy_if(BVector.at(i).getVector().begin(), BVector.at(i).getVector().end(), back_inserter(AVector.at(i).getVector()), condition_1); 
      } 
// Trim the AVector by removing AnObjects with Anothervector of size 0 
auto const cond_trim = [](AnObject& anobj) 
{ 
    // std::cout << "Size is " << anobj.getVector().size(); 
    return anobj.getVector().size() == 0; 
}; 

std::vector<Anotherobject>& AnObject::getVector() 
{ 
    return Anothervector; 
} 

auto iter = std::remove_if(AVector.begin(), AVector.end(), cond_trim); 
AVector.erase(iter, AVector.end()); 

UPDATE Bug trouvés - Effacement d'un objet (AnObject) dans le AVector n'a pas l'effacement du vecteur d'élément (Anothervector).

+6

Vous utilisez l'itérateur de fin d'un vecteur différent. – Galik

+0

@Galik, Désolé pour cette faute de frappe. Je l'ai corrigé. – jsp99

+5

S'il vous plaît ** [modifier] ** votre question avec un [mcve] ou [SSCCE (court, autonome, exemple correct)] (http://sscce.org) – NathanOliver

Répondre

1

cond_trim doit accepter un élément d'une collection, et non un ensemble lui-même, à savoir un objet de type AnObject, pas Avector.

+1

Cela peut être une faute de frappe dans votre exemple, car il ne devrait même pas compiler (sauf si AVector hérite de AnObject). –