2011-10-24 113 views
0

我正在调查std::set的代码。我看到insert签名为_Pairib insert(const value_type& _Val)。为什么通过引用传递输入参数?我知道standardcContainers将它们的元素复制到容器的内存中。有人知道这是如何实现的吗?分配者进入图片的位置在哪里?任何解释如何存储/插入元素的小代码/伪代码都将被赞赏。我有兴趣了解如何完成复制。STL容器插入元素

回答

2

分配器是一个模板参数。看看定义here

template < class Key, class Compare = less<Key>, 
      class Allocator = allocator<Key> > class set; 

如果不指定自己的分配器,将采取默认的分配器(这很可能只是一个new)。

您可以在具有公共副本构造函数,析构函数和赋值运算符的类上使用STL包含器。见here:插入STL容器

元素可以是 供给公共拷贝构造,公共析构函数,和一个公共 赋值运算符的任何对象类型。析构函数不能抛出异常。 此外,关联容器(如集合和地图)必须定义一个 公共比较运算符,默认为运算符<。 容器上的某些操作可能还需要公共默认构造函数和公共等价运算符。

所以基本上这个复制是通过使用你在类中实现的上述公共成员函数完成的。

+0

那么STL调用用户定义类型的拷贝构造函数,并创建对象到分配器创建的区域中? – Avinash

+0

@Avinash - 是的。 – littleadv

+0

谢谢,你知道我如何在C++中做到这一点,我的意思是我需要使用新的位置来实现这一点。 – Avinash

2

为什么输入参数作为参考被传递。

如果按值取值,则需要两个副本:一个用于函数参数,另一个用于容器节点。

分配器来自哪里。

容器请求分配器分配和初始化通常包含元素类型的私有节点类型以及其他信息,如指向其他节点的指针。

我有兴趣了解副本是如何完成的。

私有节点类型将保存传递给insert的参数的副本。