3

我正在使用堆栈,需要检查两个是否相同。我已经超载了

bool operator== 

函数在我的代码中,现在我需要将逻辑放入代码中。我将检查几件事,看看这两个堆栈是否相同:长度、数据类型和每个元素的内容。长度和内容没有问题,它是给我问题的数据类型。

我试图做一个功能:

...
    Type getType();
};

template <class Type>
Type getType(){ returnType;}

但这没有用。

我也想过:

bool operator== (stack<Type> &lhs, stack<Type> &rhs){

    return (lsh.Type == rhs.Type);
//additional conditions will be checked.
}

如何检查它们是否是同一类型?

编辑:如果我只是检查了两个堆栈的顶部元素的数据类型怎么办?那就足够了吗?

4

5 回答 5

9

如果你operator==这样实现:

template<typename Type>
bool operator== (const stack<Type> &lhs, const stack<Type> &rhs){
    // compare and return.
}

您已经知道两个堆栈都将包含相同类型的元素。没有必要检查。

如果您想允许比较使用不同模板参数的堆栈,您可以执行以下操作:

template<typename Type1, typename Type2>
bool operator== (const stack<Type1> &lhs, const stack<Type2> &rhs){
    // compare
}

然后比较使用的元素operator==,你就完成了。当然,如果没有 and 类型的foroperator==参数,那么编译器就会报错。Type1Type2

编辑:因为你想要一个很好的错误信息,你可以这样做(使用 C++11):

#include <type_traits>

template<typename Type1, typename Type2>
bool operator== (const stack<Type1> &lhs, const stack<Type2> &rhs){
    // This is a compile time assert!
    static_assert(std::is_same<Type1, Type2>::value, "Types are not equal!");
    // compare
}

反正我会避免这种情况。让编译器自己发出错误,而不是自己做这个检查更简单。

于 2012-10-12T17:40:03.650 回答
6

C++ 不像其他(动态)语言,因为您不需要检查类型。如果两个堆栈包含不同的类型,如果您尝试比较它们,您的代码将无法编译。换句话说,跳过这一步,编译器会为你做这件事。

于 2012-10-12T17:40:34.553 回答
2

如果您使用模板(例如template <typename T> class Stack...)实现堆栈数据结构,那么您只需要重载operator==并检查大小并进行逐项比较:

template <typename T>
bool operator==(const Stack<T> & lhs, const Stack<T> & rhs)
{
  if (lhs.Size() != rhs.Size())
    return false;

  // Compare item by item
  ...
}

该类型将由 C++ 编译器类型系统隐式检查(如果您有 aStack<int>并尝试与 a 进行比较,Stack<string>您将遇到编译器错误)。

于 2012-10-12T17:43:23.727 回答
1

我找到了一个可以解决您的目的的简单程序,它是检查两个堆栈是否相等的简单且非常有效的方法。

  bool isEqual(stack<Type> &stack1, stack<Type> &stack2) {
    if (stack1.empty() && stack2.empty())
      return true;
    else if (stack1.empty() || stack2.empty())
      return false;
    while (!stack1.empty() && !stack2.empty())
    {
      if (stack1.top() != stack2.top())
        return false;
      stack1.pop();
      stack2.pop();
    }
    if (stack1.empty() && stack2.empty())
      return true;
    else
      return false;
  }
于 2019-06-17T10:40:57.090 回答
0

正如您在 stackoverflow 的 C++ 标记定义中看到的那样

C++ is a widely-used, statically-typed, free-form, compiled,
multi-paradigm, multi-level, imperative, general-purpose,
object-oriented programming language.

在此定义statically-typed中,意味着所有类型信息在编译时必须是干净的,因此在 C++ 中,如果您想要拥有不同类型的容器或想要比较不同类型的容器,则必须在编译时通过使用模板来识别它。

因此,当您比较 2 种不同类型的容器(此处为堆栈)时,您知道两种容器的类型,并且不需要比较它们的类型。因此,如果您想要不同类型的容器,它们应该都派生自同一个类,以便它们可以存储为相同类型,或者您必须将它们保存为void*(除非您知道自己在做什么,否则这是非常危险的)。如果您从同一个类派生所有类,您可以简单地使基类多态(通过添加至少一个虚函数)并使用 typeid 来获取对象的类型,或者您可以添加一个进行比较的虚函数,然后将其专门化每个派生类(甚至您可以混合使用这两种技术)但如果void*您必须有另一种方法来识别对象的类型!

于 2012-10-12T18:06:18.390 回答