我在矢量中定义了一个矢量:
std::vector<std::vector<myObj>> some_list(list_size);
some_list中的某些条目包含元素,而有些元素不具有3个元素具有3个元素,其中4个具有4个大小等等,例如:
some_list[0] {size=3}
some_list[1] {size=4}
但在某些时候,有一个带有0个元素的空条目,例如:
some_list[14] {size=0}
此后,每个条目的大小也为0。
我正在尝试调整我的矢量大小,因此它排除了这些条目,并且只留下具有元素的条目。但由于某种原因,我无法使其发挥作用。这就是我所拥有的:
int snum = 0;
for (std::vector<std::vector<myObj>>::iterator a_it = a_list.begin();
a_it != a_list.end(); a_it++) {
while (a_it->size() != 0) {
snum++;
}
}
a_list.resize(snum);
答案 0 :(得分:4)
这一行:
while (a_it->size() != 0) {
应该是:
if (a_it->size() != 0) {
答案 1 :(得分:2)
如果您确定第一个空的后面的所有条目也都是空的,您可以使用std::find_if
获取第一个空元素的迭代器,然后使用std::vector::erase
:
#include <algorithm>
bool is_empty(const std::vector<myObj>& v) { return v.empty(); }
v.erase(std::find_if(v.begin(), v.end(), is_empty), v.end() );
或者,如果您有C ++ 11支持,则可以使用lambda:
v.erase(std::find_if(v.begin(),
v.end(),
[](const std::vector<myObj>& v){ return v.empty(); }),
v.end() );
我使用v
的地方是some_list
。
另外,如果空条目不在最后,您可以使用具有合适功能的erase remove idiom删除零元素的条目。
v.erase(std::remove_if(v.begin(), v.end(), is_empty), v.end() );
答案 2 :(得分:0)
您应首先删除空元素。您可以使用现成的算法:
#include <algorithm>
#include <functional>
some_list.erase(std::remove_if(some_list.begin(), some_list.end(),
std::mem_fn(&std::vector<myObj>::empty),
some_list.end());
然后您可以调整大小:some_list.resize(N)
。实际上,如果您希望新元素无论如何都是空的,您可以跳过erase
步骤并仅执行remove_if
部分。