18、顺序存储线性表的分析

长度相同的两个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;

}

线性表必须先插入元素,才能使用操作符[]访问元素。

问题分析:顺序存储结构线性表提供了数组操作符重载,通过重载能够快捷方便的获取目标位置处的数据元素,在具体的使用形式上类似数组,但是由于本质不同,不能代替数组使用。

顺序存储线性表的插入和删除操作存在重大效率隐患,线性表作为容器类,应该避免拷贝构造和拷贝赋值,顺序存储线性表可能被当作数组误用,工程开发中考虑使用数组类代替原生数组使用。

猜你喜欢

转载自blog.csdn.net/ws857707645/article/details/80339787