【问题标题】:Trying to merge two sorted dynamic arrays - C++试图合并两个排序的动态数组 - C++
【发布时间】:2015-02-15 03:11:27
【问题描述】:

我有一个名为 OrderedList 的模板类,它采用原始数据类型并将其从最小到最大排序到一个列表中。我试图重载加法运算符以允许将两个列表合并到一个 OrderedList 中。我希望该方法返回一个新的 OrderedList 对象,但出现错误 这是我的 OrderedList + 运算符方法的代码。我还没有测试过这个方法的逻辑,所以我假设有一些错误。我目前只是试图让 + 运算符合并数组并返回一个新对象

   template<class mytype>
OrderedList<mytype>& OrderedList<mytype>::operator+ (const OrderedList<mytype>& a)
{
int size = a.size() + count;
int i=0, j=0, k=0;
OrderedList<mytype> *newList = new OrderedList<mytype>(size);

   while (i < a.size() && j < count) {
        if (a[i] <= list[j]) {
             newList[k] = a[i];
              i++;
        } else {
              newList[k] = list[j];
              j++;
        }
        k++;

  if (i < a.size()) {
        for (int p = i; p < a.size(); p++) {
              newList[k] = a[p];
              k++;
        }
  } else {
        for (int p = j; p < count; p++) {
              newList[k] = list[p];
              k++;
        }
  }
}
return newList;
}

【问题讨论】:

  • 您分配一个新列表,然后返回一个指向它的指针。但是您的函数类型希望您返回一个引用。加号运算符应返回该类型的新实例。在函数中创建您的类的实例,添加两个列表并返回新实例。

标签: c++ arrays sorting overloading


【解决方案1】:

正如@ConnorHollis 在评论中已经指出的那样,您在+ 运算符中分配了一个新的OrderedList 实例。除了由于类型不同而无法工作以及由于返回引用通常表明调用者不需要关心所有权而很危险之外,这也是非常出乎意料的。 +-operator 应该总是返回一个新对象,即返回的副本构造。

【讨论】:

    【解决方案2】:

    您的方法定义如下所示。

    OrderedList<mytype>& OrderedList<mytype>::operator+ (const OrderedList<mytype>& a)
    

    然而,加号运算符通常会返回类类型的新实例,所以它应该是:

    OrderedList<mytype> OrderedList<mytype>::operator+ (const OrderedList<mytype>& a)
    

    如您所见,没有参考。

    现在您有了一个指向新 OrderedList 的指针,但您不需要分配它!您可以只创建它的一个实例并通过复制构造函数或赋值运算符返回它。所以我会将新的列表实例化更改为如下所示:

    OrderedList<mytype> newList(size);
    

    然后它可能会编译。

    我决定给你做一个简单的演示! http://ideone.com/bFiv1W

    希望这能更好地解释它。

    【讨论】:

    • 好的,我现在明白了一点。在类中,我们创建了一个数组列表类,在我们的主程序中,列表被声明为 MyArrayList *list = new MyArrayList。这就是我在主程序中声明我的有序列表对象的方式,但它一直没有工作。我尝试了你声明新对象的方式,它已经奏效了。现在我只需要找到一种将两个数组相加并保持有序的有效方法。他们的关键词是高效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2019-09-09
    相关资源
    最近更新 更多