STL的容器、迭代器、算法都是templates,理论上可以操作任何型别。但由于加诸于元素的某些操作行为,STL容器元素必须满足以下三个基本条件。
1. 必须可通过copy构造函数进行复制,并且副本与原本必须完全相等。STL容器只支持value语义,不支持reference语义。所有容器会在内部生成一个元素副本,因此copy构造函数会被频繁调用,所以copy构造函数的性能应尽可能优化。
2. 必须可通过assignment操作符完成赋值操作。所有容器和算法都需使用assignment操作符,才能以新元素改写旧元素。
3. 必须可通过析构函数完成销毁动作。当容器元素被移除时,它在容器内的副本将被销毁。所以析构函数不能为private,并且析构函数绝不能抛出异常。
除了上面这些必须满足的条件,还有三个可选条件,视具体使用情况而定。
1. 序列式容器中的元素,其default构造函数必须可用。因为在没有给定初值的情况下,创建一个非空容器,或增加容器元素数量,都将调用default构造函数来完成。
2. 对于某些动作(比如搜寻),必须定义operator==以执行相等测试。
3. 在关联式容器中,元素必须定义排序准则。默认使用operator<,通过仿函数less<>被调用。
注:STL虽然不支持reference语义,但可以通过“引用计数智能指针”实现其reference语义。