2

私はそのようなことを正しく理解してプログラムすることができません (私は初心者です): 私にはベクトルがあります。ベクトルには、fieldA、fieldB、fieldC という要素があります。したがって、これらのベクトルの配列があるので、配列の最後のベクトルから始めて、最初のベクトルの方向に向かって、要素の 1 つに特定の値があるかどうかを確認したいと思います。if (vect[i].フィールド A == 0.0)。そのような場合、 (vect[i-1].fieldA == 0.0) が同じ値を持っている場合、配列からベクトル全体を削除したいと考えています。視覚化するコードの一部、適切な「バックイテレーション」ループを作成し、関数を使用してそれを削除する方法を教えてもらえますか? erase()、remove()、deque() を試していましたが、失敗しました。

ここでコードを台無しにしたくありません。

手伝ってくれてありがとう!

編集。したがって、最初にベクトル値を含む配列をループでフィードし、次に、要素固有の値を含むすべてのベクトルを最後から削除します。たとえば、fieldA == 0.0

ベクトルの内容を削除するだけでなく、配列を切り取りたい! classB と classA の間に適切な継承があるため、フィードはうまく機能します。ベクトルを削除してこの問題を解決したいだけです。例: 2 要素のベクトルの配列。入力: 0,1 0,3 3,3 2,3 0,6 5,6 0,8 0,7 0,6 出力:0,1 0,3 3,3 2,3 0,6 5,6 0 、8。結論: 0,7 および 0,6 ベクトルが削除されました。

    classA tmp;
    for (std::vector<std::classB>::iterator iter = newW.begin(); iter != newW.end(); iter++)
        {
        tmp.set_fieldA(iter->a);
        tmp.set_fieldB(iter->b);
        tmp.set_fieldC(iter->c);
        objA.push_back(tmp);
        }

    vector<std::classA> objA;
        for(int i = objA.size()-1; i > 0; i--)
        {
        if (objA[i].fieldA == 0.0)
            if (objA[i-1].fieldA == 0.0)
                objA.erase(objA[i-1]); //remove last vector from array
        }
4

1 に答える 1

5

私はあなたのコードを次のように解釈しています。3 つのメンバーを持つ Vector という名前の構造体があります。

struct Vector
{
    double fieldA;
    double fieldB;
    double fieldC;
}

以下のコードは次のように動作します。逆反復子 ( and ) を使用std::find_if_notして、 とは異なる後ろから最初の要素を見つけます。次に、これを ( を使用して) 通常の反復子に変換し、ベクターの末尾と比較します。最後に、呼び出しは実際にそれらを消去します (いわゆるerase-remove idiom )rbegin()rend()fieldA0base()v.erase

#include <algorithm>
#include <vector>
#include <iostream>
#include <iterator>

int main()
{

   struct Vector { int fieldA; int fieldB; };
   std::vector<Vector> v = { 
      Vector{ 1, 0 }, Vector{ 2, 1 }, Vector{ 0, 2 }, Vector{ 1, 3 }, Vector{ 0, 4 }, 
      Vector{ 0, 5 }, Vector{ 5, 6 }, Vector{ 6, 7 }, Vector{ 0, 8 }, Vector{ 0, 9 }, Vector{ 0, 10} 
   };   

   for (auto& e: v) { std::cout << "{" << e.fieldA << "," << e.fieldB << "}, "; };
   std::cout << "\n";

   auto m = std::find_if_not(v.rbegin(), v.rend(), [&](Vector const& elem){
       return elem.fieldA == 0;
   }).base();

   if (m != v.end())
      // remove all but one matching element
      v.erase(m + 1, v.end());

   for (auto& e: v) { std::cout << "{" << e.fieldA << "," << e.fieldB << "}, "; };
   std::cout << "\n";   
}

LiveWorkSpaceでの出力

于 2013-02-05T09:31:33.477 に答える