Как удалить пустые ячейки вектора при использовании remove_if

Я заполняю 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());

Я в замешательстве, может кто-нибудь сказать мне, как я могу это сделать?

2

Решение

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.

4

Другие решения


По вопросам рекламы [email protected]