长度相同的两个SeqList,插入和删除操作的平均耗时是否相同?
数据类型的不同,int和string就不同,如果是类对象,就更费时间了,效率要看具体对象,分析代码或者算法的效率不能只看时间复杂度,不是绝对的指标,要分情况考虑。基于顺序存储结构的线性表不适合类类型对象作为数据元素存储。
下面的代码正确吗?
Staticlist<int* ,s>s1;
Staticlist<int* ,s>s2;
for(int i=0,i<s1.capacity();i++)
{s1.insert(0,new(i));}
s2=s1; //copy assignment
for(int i=0;i<s1.length();i++)
{delete s1[i];
delete s2[i];}
两个线性表所指向的地址是一样的,这样在释放内存的时候会释放两次
void func()
{DynamicList<int>d1(5);
DynamicList<int>d2=d1; //copy construct
for(int i=0;i<d1.capacity();i++)
{d1.insert(i,i);
d2.insert(i,i*i);}
for(int i=0;i<d1.length();i++)
{cout<<d1[i]<<endl;}
}
d1,d2的m_marry指向同一个空间,也可能会释放两次
分析:对于容器类型的类,可以考虑禁用拷贝构造和赋值操作
template<typename T>
class List:public object
{protected:
List(cosnt List&);
List& operator=(const List&);
public:
List() { }
//.....
};
下面的代码正确吗? 为什么?
int main()
{
StaticList<int,5>List;
for(int i=0,i<List.capacity();i++)
{
List[i]=i*i; //将线性表当作数组使用
}
return 0;
}
线性表必须先插入元素,才能使用操作符[]访问元素。
问题分析:顺序存储结构线性表提供了数组操作符重载,通过重载能够快捷方便的获取目标位置处的数据元素,在具体的使用形式上类似数组,但是由于本质不同,不能代替数组使用。
顺序存储线性表的插入和删除操作存在重大效率隐患,线性表作为容器类,应该避免拷贝构造和拷贝赋值,顺序存储线性表可能被当作数组误用,工程开发中考虑使用数组类代替原生数组使用。