代码之家  ›  专栏  ›  技术社区  ›  djeidot

carray<int,int>和carray<int,int&>有什么区别?

  •  3
  • djeidot  · 技术社区  · 14 年前

    CMAP、clist和几乎所有使用模板的东西都是一样的(我猜)。

    我觉得很难理解何时使用哪个。的确,对于班级之类的学生, <class, class&> 表单通常是您想要的,但对于基本类型如 int , float 等等,首选哪种形式?

    2 回复  |  直到 14 年前
        1
  •  5
  •   SergGr    14 年前

    如果你真的不需要别的东西,就用 CArray<Type> ARG_TYPE 会是它的违约 const TYPE& . 实际使用 Type& 作为 阿尔吉型 不是个好主意。这在理论上允许 CArray 修改传递给相应方法的对象/值。当然 动态数组 不做这种事,但最好是安全一点。

    如果您查看MS VC中可用的源代码,您将看到 阿尔吉型 在一些方法中用作参数的类型,该参数为数组的某些元素(如

    void SetAt(INT_PTR nIndex, ARG_TYPE newElement)
    INT_PTR Add(ARG_TYPE newElement)
    void SetAt(INT_PTR nIndex, ARG_TYPE newElement)
    void InsertAt(INT_PTR nIndex, ARG_TYPE newElement, INT_PTR nCount = 1)
    

    如果你在 Type const Type& ,那么唯一受影响的是复制多少次以及复制哪些数据。当通过引用传递值时,实际上只传递指向该值的指针。这对于对象(对复制构造函数的额外调用)非常重要,但对于简单类型来说并不重要。当然,您可以尝试通过强制复制来保存几个字节。 char short 这比相应的指针(32/64位,取决于平台)小,但我不认为这真的值得额外的麻烦。如我之前所说,我认为使用默认值 carray<类型> 除非你真的有理由改变它,否则这是个好方法。

        2
  •  2
  •   carraysearcher    14 年前

    我经常有同样的问题,目前正在努力解决一个奇怪的错误,我认为这与差异有关。我不确定我是否完全了解正在发生的事情,但请考虑以下操作:

    a.Add(a[0]);
    

    如果A声明为 CArray<int, int&> 当a太小而无法处理加法时,就出现了一个粗糙的情况,必须进行增长。将调用setatgrow()并生成数组的放大副本。不幸的是,对[0]的引用现在是对无效内存的引用,因为数组已移动。

    如果A声明为 CArray<int, int> 然后将[0]的副本传递给add函数,没有问题。

    再一次,我仍在试图弄明白这一点(这就是为什么我最终发现了这个讨论),但如果你在执行一个会增加其规模的操作时引用了自己的carray,那么使用references似乎有一个微妙的问题。你不能信任推荐人所以 carray<int,int> 似乎更受欢迎。