我在重载比较运算符方面遇到麻烦,以便以这种方式比较两个pair
结构:
typedef pair<string, unsigned int> INDEX;
bool operator>(INDEX &v1, INDEX &v2)
{
if(v1.second == v2.second) //if integer parts are equal
{
//string that comes earlier in the dictionary should be larger
return v1.first < v2.first;
}
return v1.second > v2.second;
}
实际比较发生在this->element(hole/2) < this->element(hole)
fixUp(CBTNODE hole)
内BinaryHeap
,CompleteBinaryTree
类的成员函数,它是T
的派生类。 INDEX
将被实例化为typedef
类型,pair<string, unsigned int>
为operator>
。
换句话说,两对之间的比较:(“a.txt”,42)&gt; (“b.txt”,42)应该返回true。
我试图以两种不同的方式在类声明之外重载bool operator>(INDEX &v1, INDEX &v2);
,但它们都没有工作:
bool operator>(BinaryHeap<T> &v1, BinaryHeap<T> &v2);
typedef int CBTNODE;
template <typename T>
class CompleteBinaryTree {
public:
//Initializes an empty binary tree
CompleteBinaryTree(int initialSize = 10);
//Destructor
~CompleteBinaryTree();
//Returns the element of the CBT pointed to by node. Behavior is undefined
//if node does not exist.
T element(CBTNODE node);
protected:
T *data;
int numElts, maxElts;
};
typedef pair<string, unsigned int> INDEX;
template <typename T>
class BinaryHeap : public CompleteBinaryTree<T>
{
public:
//Maintain heap property with bottom up heapify method.
void fixUp(CBTNODE hole);
};
bool operator>(INDEX &v1, INDEX &v2);
非常感谢任何帮助!
Z.Zen
以下是声明:
template <typename T>
T CompleteBinaryTree<T>::element(CBTNODE node) {
assert(node >= 0);
assert(node < numElts);
return data[node];
}
template <typename T>
void BinaryHeap<T>::fixUp(CBTNODE hole)
{
T tmp = this->element(hole);
while( hole > 0 && this->element(hole/2) < tmp )
{
//do stuff
}
}
bool operator>(INDEX &v1, INDEX &v2)
{
if(v1.second == v2.second) //if two have same relevance
{
return v1.first < v2.first;
}
return v1.second > v2.second;
}
实现:
{{1}}
答案 0 :(得分:1)
临时(例如element
func的结果)无法绑定到对非const
的引用,例如operator>
的正式参数。
如此声明:
bool operator>( INDEX const& v1, INDEX const& v2 )
但是,您提供的实施似乎不适用于operator>
。
虽然我喜欢它,但你想要的却是operator<
,因为那是标准算法所要求的。也许与operator==
结合使用(因为从operator<
合成它是低效的)。有了这两个关系,可以相对有效地检查任何关系。
顺便说一句,如果您停止使用所有其他任何名称来获取宏(请参阅常见问题解答),那么您可以避免与宏无意中发生名称冲突。
干杯&amp;第h。,
答案 1 :(得分:1)
请勿明确指出INDEX:
template<class F, class S>
struct Index {
std::pair<F, S> Value;
Index(const std::pair<F, S>& pValue)
: Value(pValue) {}
};
template<class F, class S>
bool operator<(const Index<F, S>& pLeft, const Index<F, S>& pRight) {
// your implementation...
}