2015-09-15 3 views
2

Je remplis un vecteur std :: avec un objet.Comment supprimer les cellules vides d'un vecteur si vous utilisez remove_if

cette instance de vecteur tel que défini dans la ligne suivante:

std::vector< std::list< pcl::PointXYZRGB>> tab; 

Je veux maintenant supprimer les cellules vides. J'ai essayé comme suit:

tab.erase(remove_if(tab.begin(), tab.end(), std::is_empty), tab.end()); 

Je reçois l'erreur suivante:

error: missing template arguments before ‘)’ token 
    voxels.erase(remove_if(voxels.begin(), voxels.end(), is_empty**)**, voxels.end()); 

Je suis confus, quelqu'un peut-il me dire comment je peux le faire?

+4

qu'est-ce que 'is_empty'? –

+2

Lorsque vous posez une question sur le débordement de pile, il est important de fournir suffisamment d'informations pour pouvoir y répondre. La première étape que vous devriez faire est d'essayer de réduire votre problème à un plus petit. Vous ne comprenez pas comment 'erase' et' remove_if' fonctionnent; alors créez un petit programme qui utilise ces fonctions, et voyez si vous pouvez obtenir la même erreur. Vous pouvez le faire soit en commençant par votre programme complet et en coupant des pièces, soit en commençant par un programme vide et en ajoutant des parties. Une fois que vous avez un exemple SIMPLE, AUTONOME et COMPLET, vous pouvez alors poser des questions sur ce problème. – Yakk

+1

@ T.C. L'OP a répondu à votre question dans le commentaire ci-dessous: 'std :: is_empty' est ce qu'elle essaie d'utiliser. Bon vieux 'using namespace std', n'est-ce pas horrible? – Yakk

Répondre

4

std::is_empty est un modèle de traits. std::is_empty<X> vous indique si le typeX est un type vide - c'est-à-dire struct {} ou class {} avec rien dedans.

Ce n'est pas ce que vous voulez. Tout d'abord, parce qu'il ne peut pas être appelé de la façon dont vous avez besoin d'être appelé - il n'a aucun operator() qui vous soit utile - et en second lieu, il prend un type, pas une instance de type, et répond aux questions sur le type, pas les instances.

auto list_is_empty = [](std::list< pcl::PointXYZRGB> const& l) { 
    return l.empty(); 
}; 
tab.erase(remove_if(tab.begin(), tab.end(), list_is_empty), tab.end()); 

résoudra votre problème. Une meilleure façon de le résoudre serait:

struct container_is_empty_t { 
    template<class C> 
    bool operator()(C const& c)const{ 
    return c.empty(); 
    } 
    template<class T, size_t N> 
    bool operator()(T(&)[N])const{ 
    return N > 0; 
    } 
}; 
static container_is_empty_t const container_is_empty; 

dans un fichier d'en-tête avec le code utilitaire, puis:

tab.erase(remove_if(tab.begin(), tab.end(), container_is_empty), tab.end()); 

fait la même chose, mais sans être codé en dur au travail que sur std::list< pcl::PointXYZRGB> s .

+0

Techniquement, il a un 'operator()' - hérité de 'integral_constant' :) –

+0

@ T.C. Bah, humbug. – Yakk

+0

et venir dans un TS près de chez vous bientôt: effacement uniforme avec: 'erase_if (tab, container_is_empty)' – TemplateRex