|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
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[strlen(name) + 1];
- 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[strlen(obj.pname) + 1];
- 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[strlen(obj.pname) + 1];
- // 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使用场景: 字典类型数据。
|
|