2

我在网上找到了一个非常简单的 List 类。在我的程序中,我创建了一个特定类型的列表并将其用于一些计算。现在我想使用相同的列表(相同类型的列表)并将其用于其他事情。为了让事情更清楚:

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

我使用两个函数在这些列表中添加信息:

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

这是我正在使用的两个基本列表。现在我想对其他顶点和三角形(不同的模型)使用相同的列表。那么我应该如何“删除”两个列表中的所有内容并将它们与不同的顶点和三角形一起使用?

这是我正在使用的典型 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) 将Clear方法添加到您的List类中,如下所示:

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) 如果您绝对不想更改代码,则可以。(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;
};

反正你懂这个意思。我把它们中的一些留空了,因为我不知道它们到底是做什么的。

关于您的问题,您显然是在存储指向Trianglesand的指针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 回答