Я заполняю std :: vector некоторым объектом.
этот экземпляр вектора, как определено в следующей строке:
std::vector< std::list< pcl::PointXYZRGB>> tab;
Теперь я хочу удалить пустые ячейки. Я пытался, как следующее:
tab.erase(remove_if(tab.begin(), tab.end(), std::is_empty), tab.end());
Я получаю следующую ошибку:
error: missing template arguments before ‘)’ token
voxels.erase(remove_if(voxels.begin(), voxels.end(), is_empty**)**, voxels.end());
Я в замешательстве, может кто-нибудь сказать мне, как я могу это сделать?
std::is_empty
шаблон черт std::is_empty<X>
говорит вам, если тип X
это пустой тип, то есть это struct {}
или же class {}
с ничего внутри.
Это не то, что вы хотите. Во-первых, потому что он не может быть назван так, как вам нужно, чтобы он назывался — он не имеет operator()
это полезно для вас — и во-вторых, он принимает тип, а не экземпляр типа, и отвечает на вопросы о типе, а не экземплярах.
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());
решит вашу проблему. Лучший способ решить это было бы:
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;
в некотором заголовочном файле с кодом утилиты, тогда:
tab.erase(remove_if(tab.begin(), tab.end(), container_is_empty), tab.end());
делает то же самое, но не будучи жестко закодированным, чтобы работать только на std::list< pcl::PointXYZRGB>
s.