1

次のように定義されたベクトル内にベクトルがあります。

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

3 に答える 3

4

この行:

while (a_it->size() != 0) {

おそらく読むべきです:

if (a_it->size() != 0) {
于 2013-09-07T16:22:00.323 に答える
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 をサポートしている場合は、ラムダを使用できます。

v.erase(std::find_if(v.begin(), 
                       v.end(), 
                       [](const std::vector<myObj>& v){ return v.empty(); }), 
        v.end() );

私が使用した場所vは ですsome_list

そうではなく、空のエントリが最後にあるわけではない場合は、適切な関数で消去削除イディオムを使用して、要素がゼロのエントリを削除できます。

v.erase(std::remove_if(v.begin(), v.end(), is_empty), v.end() );
于 2013-09-07T16:22:23.940 に答える
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部分だけを実行できます。

于 2013-09-07T16:22:42.920 に答える