我在网上找到了一个非常简单的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];}
}
答案 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;
};
嗯,你明白了。因为我不确切知道他们做了什么,所以我把他们中的一些留空了。
关于您的问题,您显然存储了指向Triangles
和Vertex
的指针。如果指向该对象的唯一指针是列表对象中的指针,则应该在列表上运行以删除每个对象,在删除整个向量之前。
template <typename T>
void ClearList(List<T> &l)
{
for(unsigned int i = 0; i < l.Size(); ++i) {
delete l[ i ];
}
l.Clear();
}
希望这有帮助。