我正在研究std::set
代码。我将insert
签名视为_Pairib insert(const value_type& _Val)
。为什么输入参数通过引用传递?我知道standardcContainers将他们的元素复制到容器的内存中。有谁知道这是如何实现的?分配器在哪里输入图片?任何解释元素如何存储/插入的小代码/伪代码都将受到赞赏。我有兴趣了解副本是如何完成的。
答案 0 :(得分:2)
分配器是模板参数。查看定义here:
template < class Key, class Compare = less<Key>,
class Allocator = allocator<Key> > class set;
如果你没有指定自己的分配器,它将采用默认的分配器(可能只是new
)。
您可以在具有公共副本构造函数,析构函数和赋值运算符的类上使用STL包含器。见here:
插入到STL容器中的元素可以是任何对象类型 提供公共拷贝构造函数,公共析构函数和公共 赋值运算符。析构函数可能不会抛出异常。 此外,关联容器(如set和map)必须具有 公共比较运算符定义,即运算符&lt;默认情况下。 容器上的某些操作可能还需要公共默认值 构造函数和公共等价运算符。
因此,基本上通过使用您在类中实现的上述公共成员函数来完成复制。
答案 1 :(得分:2)
为什么输入参数作为参考传递。
如果按值获取,则需要两个副本:一个用于函数参数,另一个用于容器节点。
分配器在哪里来到这里。
容器请求分配器分配和初始化通常包含元素类型的私有节点类型以及其他信息,例如指向其他节点的指针。
我有兴趣了解副本是如何完成的。
私有节点类型将保存传递给insert
的参数的副本。