moc 发表于 2018-9-21 21:29:33

052-C++之STL容器共性与使用场景

1、容器的共性机制
    STL所有容器都是基于C++模板技术实现的。
理论提高: 所有容器提供的都是值(value)语意,而非引用(reference)语意。即容器执行插入元素的操作时,内部实现的都是拷贝动作。所以往STL容器中存储的元素必须都是能够拷贝的。(类必须提供拷贝构造函数,注意深浅拷贝)
        1. 除了queue与stack外,每个容器都提供可返回迭代器的函数,运用返回的迭代器就可以访问元素;
        2. 通常STL不会丢出异常,要求使用者确保传入正确的参数;
        3. 大小有关的操作:c.size();、 c.empty().
        4. 比较操作:c1 == c2;    c1 != c2;
class Teacher
{
public:
        Teacher(const char *name, int age)
        {
                pname = new char;
                strcpy_s(pname, strlen(name) + 1, name);
                this->age = age;
        }

        ~Teacher()   // 需要把构造函数中申请的空间释放掉
        {
                if (pname != NULL)
                {
                        delete[] pname;
                        pname = NULL;
                }
        }

        // Teacher t2 = t1;深拷贝需要重写拷构造函数
        Teacher(const Teacher &obj)
        {
                pname = new char;
                strcpy_s(this->pname, strlen(obj.pname) + 1, obj.pname);
                this->age = obj.age;
        }

        // 深拷贝 同样需要重写=操作符
        // t3 = t2 = t1;   // 链式编程 返回引用
        Teacher& operator=(const Teacher &obj)
        {
                // 需要先把t2旧的内存释放掉
                if (this->pname != NULL)
                {
                        delete[] pname;
                        pname = NULL;
                }
                // 根据t1的大小分配内存
                pname = new char;
                // copy t1的数据到t2
                strcpy_s(this->pname, strlen(obj.pname) + 1, obj.pname);
                this->age = obj.age;
        }

        void printT()
        {
                cout << pname << '\t' << age << endl;
        }

private:
        char *pname;
        int age;
};

void main01()
{
        Teacher t1("小明", 22);
        t1.printT();

        vector<Teacher> v1;
        v1.push_back(t1);    // 把t1拷贝一份 存入到容器中...
}

int main()
{
        main01();
        system("pause");
        return 0;
}
2、各个容器的使用场景

|vector|deque|list|set|multiset|map|multimap
内存结构|单端数组|双端数组|双向链表|二叉树|二叉树|二叉树|二叉树
可随机存储|是|是|否|否|否|对key而言是|否
元素搜寻速度|慢|慢|非常慢|快|快|对key而言快|对key而言快

deque使用场景:如排队购票系统,支持头端的快速移除,尾端的快速添加。如果采用vector,头端移除时,会移动大量元素,速度慢。
vector与deque的比较:
        1. vector.at()比deque.at()效率高。
        2. 如果释放大量元素,vector更快。
        3. deque支持头部与尾部的快速插入。
list使用场景:适用于频繁的不确定位置元素的插入和移除。
set使用场景: 如游戏的个人得分系统,存储从高到低顺序排列。
map使用场景: 字典类型数据。
页: [1]
查看完整版本: 052-C++之STL容器共性与使用场景