2

私はオンラインで非常に単純なリストクラスを見つけました。私のプログラムでは、特定のタイプのリストを作成し、それをいくつかの計算に使用しました。同じリスト(同じタイプのリスト)を使用して、他の用途に使用したいと思います。物事をより明確にするために:

List<Vertex*> vertices;
List<Triangle*> triangles;

2つの関数を使用して、これらのリストに情報を追加しています。

void AddVertex(List<Vector> &vertex)
void AddFaces(List<triangle_data> &f)

これらは私が使用している2つの基本的なリストです。ここで、他の頂点と三角形(異なるモデル)に同じリストを使用したいと思います。では、2つのリスト内のすべてを「削除」して、それらを異なる頂点と三角形で使用するにはどうすればよいでしょうか。

これは典型的なlist.hです。私が使用しているのは:

template <class Type> class List {
public:
            List(int s=0);
            ~List();
    void    allocate(int s);
    void    SetSize(int s);
    void    Pack();
    void    Add(Type);
    void    AddUnique(Type);
    int     Contains(Type);
    void    Remove(Type);
    void    DelIndex(int i);
    Type *  element;
    int     num;
    int     array_size;
    Type    &operator[](int i){assert(i>=0); assert(i<num); return element[i];}
}
4

3 に答える 3

3

std::listやstd::vectorのようなSTLコンテナーを使用し、clear()メンバー関数を使用します。

于 2013-02-14T20:21:31.133 に答える
1

どうぞ。Listクラスは、実際にはベクトルクラスです。

次のいずれかを実行できます。

(1)それをstd :: vectorに置き換えてから、 std :: vector::clearを呼び出します。

(2)次のようにListクラスにClearメソッドを追加します。

void List::Clear(bool resetSize /* = false */) {
    num = 0;
    if (resetSize) {
         delete [] element; element=0; array_size = 0;
    }
}

次に、 Clearを適切に呼び出します。

また

(3)これを行うことができます:

while (list.num) list.DelIndex(list.num-1);

これは、 listという名前のListインスタンスがあることを前提としています。

そしてここに解説があります:

(1)は標準的であり、次の人があなたのコードを読みやすいので、好まれます。(2)コードを絶対に変更したくない場合はOKです。(3)本当に怠け者で、パフォーマンスを気にしない場合(または、何らかの理由でListクラスを変更できない場合(たとえば、ヘッダーにしかアクセスできない場合)は問題ありません)。

于 2013-02-14T20:50:39.927 に答える
0

私のアドバイスは採用するstd::vector<>ことですが、あなたのコードはその「」に大きく依存していることをあなたから読みましたList。実際、それは完全に問題ではありません。この方法List<>で「変換」することができますstd::vector<>(最善の方法ではありません、それは本当です)。

template <class Type> class List {
public:
    List(int s=0)
        { v.capacity( s ); }
    ~List()
        { v.clear(); }
    void    allocate(int s)
        { v.reserve( s ); }
    void    SetSize(int s)
        { v.resize( s ); }
    void    Pack()
        {}
    void    Add(Type x)
        { v.push_back( x ); }
    void    AddUnique(Type)
        {}
    int Contains(Type x)
        { std::vector::iterator it = find( v.begin(), v.end(), x );
          return ( it - v.begin() );
        }
    void    Remove(Type x)
        { int pos = Contains( x ); if ( pos < Size() ) { DelIndex( pos ); } }
    void    DelIndex(int i)
        { v.erase( v.begin() + i ); }
    Type    &operator[](int i)
        {assert(i>=0); assert(i<num); return element[i];}
    Type    &operator[](int i) const
        {assert(i>=0); assert(i<num); return element[i];}
    unsigned int Size() const
        { return v.size(); }
private:
    std::vector<T> v;
};

さて、あなたはアイデアを得る。彼らが何をしているのか正確にわからないので、私はそれらのいくつかを空のままにしました。

あなたの質問について、あなたはどうやらTrianglesとへのポインタを保存しているようVertexです。そのオブジェクトへの唯一のポインタがリストオブジェクト内のポインタである場合は、ベクトル全体を削除する前に、各オブジェクトを削除するためにリストを実行する必要があります。

template <typename T>
void ClearList(List<T> &l)
{
    for(unsigned int i = 0; i < l.Size(); ++i) {
        delete l[ i ];
    }

    l.Clear();
}

お役に立てれば。

于 2013-02-14T21:33:26.790 に答える