鱼C论坛

 找回密码
 立即注册
查看: 1967|回复: 0

[学习笔记] 052-C++之STL容器共性与使用场景

[复制链接]
发表于 2018-9-21 21:29:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

  10.         ~Teacher()   // 需要把构造函数中申请的空间释放掉
  11.         {
  12.                 if (pname != NULL)
  13.                 {
  14.                         delete[] pname;
  15.                         pname = NULL;
  16.                 }
  17.         }

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

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

  41.         void printT()
  42.         {
  43.                 cout << pname << '\t' << age << endl;
  44.         }

  45. private:
  46.         char *pname;
  47.         int age;
  48. };

  49. void main01()
  50. {
  51.         Teacher t1("小明", 22);
  52.         t1.printT();

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

  56. int main()
  57. {
  58.         main01();
  59.         system("pause");
  60.         return 0;
  61. }
复制代码

2、各个容器的使用场景
vectordequelistsetmultisetmapmultimap
内存结构单端数组双端数组双向链表二叉树二叉树二叉树二叉树
可随机存储对key而言是
元素搜寻速度非常慢对key而言快对key而言快

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

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 07:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表