如何迭代向量中的向量?

时间:2013-09-07 16:19:56

标签: c++ vector

我在矢量中定义了一个矢量:

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);

3 个答案:

答案 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部分。