我正在使用堆栈,需要检查两个是否相同。我已经超载了
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.
}
如何检查它们是否属于同一类型?
编辑:如果我只检查了两个堆栈顶部元素的数据类型怎么办?那就够了吗?
答案 0 :(得分:8)
如果您实施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==
比较元素,您将完成。当然,如果类型operator==
和Type1
的参数没有Type2
,那么编译器将发出错误。
编辑:既然你想要一个很好的错误信息,你可以这样做(使用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
}
无论如何我都会避免这种情况。让编译器发出自己的错误更简单,而不是自己做这个检查。
答案 1 :(得分:6)
C ++与其他(动态)语言不同,因为您不需要检查类型。如果两个堆栈包含不同的类型,则在尝试比较它们时,代码将无法编译。换句话说,跳过这一步,编译器将为您完成。
答案 2 :(得分:2)
如果使用 templates (例如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 ++编译器类型系统将隐式检查该类型(如果您有Stack<int>
并尝试与Stack<string>
进行比较,则会出现编译器错误。)
答案 3 :(得分: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 ++中如果你想拥有不同类型的容器或者想要比较不同类型的容器,你必须在编译时识别它通过使用模板。
因此,当您比较两种不同类型的容器(此处为堆栈)时,您知道两种容器的类型,并且您不需要比较它们的类型。因此,如果你想要不同类型的容器,它们都应该来自同一个类,这样它们就可以存储为相同类型,或者你必须将它们保存为void*
(除非你知道你在做什么,否则这是非常危险的)。如果你从同一个类派生所有类,你可以简单地使基类多态(通过添加至少一个虚函数)并使用typeid来获取对象的类型,或者你可以添加一个虚拟函数进行比较,然后将其专门化每个派生类(甚至你可以混合使用这两种技术)但是在void*
的情况下你必须有另一种方法来识别对象的类型!
答案 4 :(得分:0)
我找到了一个简单的程序来解决您的目的,它是一种简单而非常有效的方法来检查两个堆栈是否相等。
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;
}