用C ++删除整个List

时间:2013-02-14 20:13:15

标签: c++ list

我在网上找到了一个非常简单的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];}
}

3 个答案:

答案 0 :(得分:3)

我会使用像std :: list或std :: vector这样的STL容器,并使用clear()成员函数。

答案 1 :(得分: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;
    }
}

然后适当地调用清除

(3)你可以这样做:

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

假设您有一个名为 list List 实例。

以下是评论:

(1)是首选,因为它是规范的,并且下一个人可以轻松阅读您的代码。 (2)如果您绝对不想更改代码,则可以。 (3)如果你真的很懒并且不关心性能(或者如果因为某种原因无法更改 List 类 - 那么你可以访问标题)

答案 2 :(得分: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;
};

嗯,你明白了。因为我不确切知道他们做了什么,所以我把他们中的一些留空了。

关于您的问题,您显然存储了指向TrianglesVertex的指针。如果指向该对象的唯一指针是列表对象中的指针,则应该在列表上运行以删除每个对象,删除整个向量之前。

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

    l.Clear();
}

希望这有帮助。