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]