none
stl集合类,如list,map,vector等的疑惑 RRS feed

  • 问题

  • 使用stl有几个问题,一直不确定,在此请教一下的大家
    1:当我们向集合类中增加一个元素时(此元素是局部变量值类型),保存的是元素的引用还是元素的拷贝副本?
    2:当我们向集合类中增加一个元素时(此元素是非局部变量值类型),保存的是元素的引用还是元素的拷贝副本?
    3:当我们向集合类中增加一个元素时(此元素是一个局部变量的对象),保存的是元素的引用还是元素的拷贝副本,如果是副本,是深度复制吗?
    4:当我们向集合类中增加一个元素时(此元素是一个非局部变量的对象),保存的是元素的引用还是元素的拷贝副本。如果是副本,是深度复制吗?
    5:如果是从集合中删除一个元素,需要另外手动delete?

    谢谢大家。
    祝大家新年快乐
    2010年2月18日 9:12

答案

  • STL是有代码的,因为他本来就是模板类,你可以在C:\Program Files\Microsoft Visual Studio 8\VC\include下面找到。

    你在增加元素的时候无论是什么变量均为拷贝而非引用,这个拷贝可能会调用你的类中的operator=。你不能保存引用,但是你可以通过保存指针的形式来实现类似功能。

    删除元素不需要手动delete。除非是你手动new的指针类型
    0xBAADF00D
    • 已标记为答案 vieri122 2010年2月18日 17:45
    2010年2月18日 15:40
    版主

全部回复

  • STL是有代码的,因为他本来就是模板类,你可以在C:\Program Files\Microsoft Visual Studio 8\VC\include下面找到。

    你在增加元素的时候无论是什么变量均为拷贝而非引用,这个拷贝可能会调用你的类中的operator=。你不能保存引用,但是你可以通过保存指针的形式来实现类似功能。

    删除元素不需要手动delete。除非是你手动new的指针类型
    0xBAADF00D
    • 已标记为答案 vieri122 2010年2月18日 17:45
    2010年2月18日 15:40
    版主
  • 谢谢斑竹,在问一下,如果我放的是对象,那么operator= 和拷贝构造函数有什么区别呢?
    • 已编辑 vieri122 2010年2月18日 17:54 完整
    2010年2月18日 17:45
  • 这个问题我就不清楚了,我认为这两个结果应该都是一样的。你可以参考下STL的标准和代码,看看他们用的是哪个。


    0xBAADF00D
    2010年2月19日 2:49
    版主
  • 谢谢 Vonger
    2010年2月19日 6:39
  • 你好,operator=和拷贝构造函数有本质区别,
    operator=是赋值运算符重载,调用前对象已经被创建。
    拷贝构造函数调用是用来创建对象。
    而STL中的_Construct_n并不会直接使用类的拷贝构造函数,而是通过placementnew构造对象,然后通过operator=来进行赋值这样做的好处是为了提高性能。不用为每个对象都去再堆上分配空间。还有就是为了使用COW具体详见:http://blog.csdn.net/Splendour/archive/2009/01/14/3772566.aspx
    麻烦把正确答案设为解答。
    2010年2月22日 1:35
    版主