容器的共通的能力:(1) C++容器都是使用C++模板进行实现的。(2) 理论提高:所有容器提供的都是值语意,而不是引用语意。容器执行插入元素的操作时,内部实现的是拷贝动作。所以STL容器内部存储的元素必须能够被拷贝,即必须提供拷贝构造函数。即提供无参构造函数、拷贝构造函数、重载=操作符。(3) 除了stack 和 quene外,每个容器都提供可返回迭代器的函数,用迭代器就可以访问元素(4) 通常STL不会出现丢出异常,要求使用者确保传入正确的参数(5) 每个容器都提供了一个默认构造函数和默认拷贝构造函数如已有vecIntA,则vector<int> vecIntB(vecIntA) 调用的是拷贝构造函数,复制vecIntA到vecIntB中(6) 与大小相关的操作方法:container.size() container.empty()(7)容器的比较操作c1==c2c1 != c2c1 = c2 //c2所有元指派给c1
案例:
class Student{
public:
char * p_mname;
int mage;
Student(char * name, int age){
p_mname = new char[strlen(name)+1];
strcpy(p_mname, name);
mage = age;
}
~Student(){
if(p_mnae! = null){
delete[] p_mname;
p_mname = null;
mage = 0;
}
}
prinT(){
cout<<p_mname<<" : " << mage<,endl;
}
// Student st2 = st1;
//解决浅拷贝问题,重写拷贝构造函数
Student( const Student & obj){
p_mname = new char[strlen(obj.p_mname)+1]; strcpy(p_mname, obj.p_mname); mage = obj.mage;
}
// st3 = st2 = st1 返回值必须是引用
//重载 = 操作符
Student& operator=(const Student & obj){
//先把st2的旧内存释放掉
if(p_mname! = null){ delete[] p_mname; p_mname = null; mage = 0; } //根据st1的大小分配内存 p_mname = new char[strlen(obj.p_mname)+1]; //copy st1的数据 strcpy(p_mname, obj.p_mname); mage = obj.mage;
return *this;
}
};
void main(){
Student st1("zhang min", 32);
vector<Student> v1;
v1.push_back(st1); //此处会报错 深拷贝和浅拷贝的问题 C++默认的拷贝函数是浅拷贝, 解决方法见深色部分
}
各种容器的使用时机:
(1) deque使用场景: 比如排队购票系统, 支持头部的快速移除和尾部的快速添加。如果使用vector则头部移除时,会有大量的数据移动,速度慢。
(2) deque和vector的比较:
vector.at()比deque.at()快,以为vector.at(0)是固定的,而deque的开始位置是不固定的
有大量释放的时候,vector花的时间少,这和内部实现有关
deque支持头部的快速移除和插入,这是其优点
(3) list使用场景: 比如公交车乘客的存储,随时有乘客上下车,支持频繁的不确定位置的插入和移除
(4) set使用场景:比如手机游戏中个人得分记录的存储,存储要求从高分到低分的顺序排列
(5) map的使用场景:比如按ID号存储10w个用户,快速通过ID查找对应用户信息。二叉树的效率很高,这就体现出来了。如果是vector,最坏的情况是遍历完整个容器才能找到。
相关文章
- Java 编程思想(第4版)学习笔记(各种容器(集合框架)的比较 Collection Map ..第11章 练习4)
- 【K8S学习笔记】Part2:获取K8S集群中运行的所有容器镜像
- JAVA学习笔记25——异常机制1:Exception简介+异常处理的try_catch_finally方法
- C++ Primer 学习笔记_45_STL实践与分析(19)--泛型算法的结构
- java jvm学习笔记十二(访问控制器的栈校验机制)
- C++学习总结(二十七)——STL容器与算法(一) STL容器的组成,线性容器(array,vector,tuple,queue,deque,stack),链式容器(list)
- Redis学习笔记~Redis事务机制与Lind.DDD.Repositories.Redis事务机制的实现
- docker学习笔记之把容器commit成镜像的方法
- java虚拟机学习笔记二:浅谈虚拟机的类加载执行子系统机制
- memcached学习笔记6--浅谈memcached的机制 以及 memcached细节讨论