第18课 - 顺序存储线性表的分析

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

        效率分析 

        

 

        问题

                长度相同的两个Seqlist , 插入删除 

                    操作的平均耗时是否相同?


2、编程实验 

SeqList效率分析 SeqList.h 




        下面的代码正确吗?为什么?

    


                                        两次释放堆空间


        下面的代码正确吗?为什么?

        


                            两次插入,且两个对象析构时释放了同一片堆空间



        分析 

                对于容器类型的类,可以考虑禁用拷贝构造和赋值操作


3、代码优化 

List.h     SeqList.h 

List.h

  1. #ifndef LIST_H  
  2. #define LIST_H  
  3.   
  4. #include"Object.h"  
  5.   
  6. namespace DTLib  
  7. {  
  8.   
  9. template <typename T>  
  10. class List : public Object  
  11. {  
  12. protected:  
  13.     List(const List& e);              //直接声明为保护成员即可
  14.     List& operator= (const List& e);  
  15. public:  
  16.     List(){}              
  17.     virtual bool insert(const T& e) = 0;  
  18.     virtual bool insert(int i,const T& e) = 0;  
  19.     virtual bool remove(int i) = 0;  
  20.     virtual bool set(int i,const T& e) = 0;  
  21.     virtual bool get(int i,T& e) const = 0;  
  22.     virtual int length() const = 0;  
  23.     virtual void clear() = 0;  
  24. };  
  25. }  
  26.   
  27. #endif // LIST_H  

SeqList.h

增加

    bool insert(const T& e)
    {
        return insert(m_length,e);
    }

main.cpp

  1. #include<iostream>  
  2. #include"DynamicList.h"  
  3.   
  4. using namespace std;  
  5. using namespace DTLib;  
  6.   
  7. int main()  
  8. {  
  9.     DynamicList<int> l(5);  
  10.   
  11.     for(int i=0;i<l.capacity();i++)  
  12.     {  
  13.         l.insert(i);  
  14.     }  
  15.   
  16.     for(int i=0;i<l.length();i++)  
  17.   
  18.     {  
  19.         cout<<l[i]<<endl;  
  20.     }  
  21.   
  22.   
  23.     return 0;  
  24. }  

                        

            下面的代码正确吗?为什么?

    StaticList<int,5> list;
    for(int i=0;i<list.capacity();i++)
    {
        list[i] = i*i;      //将线性表当数组使用
    }



    //顺序存储线性表的数组访问方式
    T& operator[] (int i)
    {
        if((0 <= i)&&(i < m_length))
        {
            return m_array[i];
        }
        else
        {
            THROW_EXCEPTION(IndexOutOfBoundsExpception,"Parameter i is invalid...");
        }
    }

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


        问题分

                顺序存储结构线性表提供了数组操作符重载通过重载能够 

                快捷方便的获取目标位置处的数据元素在具体的使用形式 

                上类似数组但是由于本质不同,不能代替数组使用。      

     

4、小结 

             顺序存储线性表的插入和删除操作存在重大效率隐患 

            线性表作为容器类,应该避免拷贝构造和拷贝赋值 

            顺序存储线性表可能被当成数组误用 

            工程开发中可以考虑使用数组类代替原生数组使用 


阅读更多
版权声明:笔记内容整理于狄泰软件 https://blog.csdn.net/qq_39654127/article/details/79962838
个人分类: 数据结构实战开发
相关热词: 第18课小猫出题
上一篇第17课 - StaticList 和 DynamicList
下一篇第19课 - 数组类的创建(上)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭