STL容器对元素使用的是值语义(value semantics). 也就是说,容器会储存要添加的元素的副本。并且在需求时返回这些元素的副本。容器还可以利用赋值运算符对元素赋值。以及调用析构函数销毁元素。因此,在编写一个可用于STL容器的类时,必须要求是可拷贝的。(copyable).
如果你倾向于使用引用语义,此时你需要保存元素的指针而不是元素的值。容器复制一个指针的时候,也是简单的拷贝指针的值。如果在容器中使用指针,建议你使用带引用计数的智能指针。遗憾的是,STL中并没有带引用计数的智能指针。你可以使用Boost提供的shared_ptr,或者是自己实现一个。带引用计数的智能指针在多线程环境里运行时会有许多问题,需要你自己来进行线程的同步。这很麻烦,而且会影响性能。但这是必须的。
以下的表列出了容器中元素的具体需求:
方法 |
描述 |
说明 |
复制构造函数 |
从现有的一个对象复制一个新对象 |
每次插入一个新元素时都会调用 |
赋值操作符(operator =) |
赋值。 |
每次修改元素时会用到 |
析构函数 |
销毁一个元素 |
每次删除元素时会用到 |
默认构造函数 |
不带任何参数的构造一个元素 |
只对某些操作是必要的,比如说resize,或者是初始化一个初始长度的vector |
Operator == |
比较两个元素的相等性 |
对两个容器的operator ==会用到 |
Operator < |
小于比较 |
对两个容器的《比较。 关联容器的默认比较操作。 |