0

在为这个模板程序声明一个默认构造函数后,我正在处理:

template<typename T>
Set<T>::Set()
    : size(0), capacity(8) {
    //allocate new array
    items = new T[capacity];
}

我有一个相对不起眼​​的功能contains,用于测试其中是否items包含特定项目。

template<typename T>
bool Set<T>::contains(const T& item) const {
    for (int i = 0; i < size; i++) {
        if (this->items[i] == item)
            return true;
    }
    return false;
}

当我在某些位置调用它时它工作正常,例如这个函数读取items并仅在没有其他副本时添加一个项目(我们的分配规范的一部分):

template<typename T>
void Set<T>::add(const T& item) {
    if (this->contains(item) == 0) {
        grow();
        items[size++] = item;
    }
}

但是当我在尝试重载运算符时调用它时==,当我通过 DRMemory 运行它时,标题中出现错误

template<typename T>
bool Set<T>::operator==(const Set<T>& other) const {
    int count = 0;
    for (int i = 0; i < size; i++) {
        if (this->contains(other.items[i])) {
           count++;
        }
    }
    if (count == size)
        return true;
    return false;
}
4

1 回答 1

2
for (int i = 0; i < size; i++) {
    if (this->contains(other.items[i])) {
       count++;
    }
}

size应该是other.size。否则other.items[i]循环中的 if 可能会越界size > other.size

同样size在后面的检查中也需要other.size

另一方面,您需要添加一个测试,size == other.size以确保集合真的相等。如果你把它放在开头,你是否使用sizeother.size以后都没有关系。

顺便提一句。而不是count用来计算相同的元素,你可以在return false一个.contains失败时立即进行。

于 2020-03-03T01:15:03.917 回答