当二元函数的参数应为const T &
或T &
时,我感到困惑。
有人可以告诉我为什么sort(vec2.begin(), vec2.end(),cmp1());//error, why?
错了,而sort(vec1.begin(), vec1.end(),cmp2());//correct
是对的吗?
他们都有const T &
个参数。
谢谢!
struct Node{
Node(char ch, int num):ch_(ch), num_(num){ pnext_ = nullptr, pprev_ = nullptr; }
char ch_;
int num_;
Node *pnext_;
Node *pprev_;
// bool operator < (const Node &no) const { return num_ > no.num_; }//最小值优先
// bool operator > (const Node &no) const { return num_ < no.num_; }//最大值优先
};
struct cmp0{
bool operator () (Node * &p1, Node * &p2) const
{
return p1->num_ > p2->num_;
}
};
struct cmp1{
bool operator ()(const Node * &p1, const Node * &p2) const
{
return p1->num_ > p2->num_;
}
};
struct cmp2{
bool operator ()(const Node &p1, const Node &p2) const
{
return p1.num_ > p2.num_;
}
};
struct cmp3{
bool operator ()(Node &p1, Node &p2) const
{
return p1.num_ > p2.num_;
}
};
int main(int argc, char *argv[])
{
vector<Node> vec1;
vector<Node*> vec2;
sort(vec1.begin(), vec1.end(),cmp2());//correct
sort(vec1.begin(), vec1.end(), cmp3());//correct
sort(vec2.begin(), vec2.end(), cmp0());//correct
sort(vec2.begin(), vec2.end(),cmp1());//error, why?
}
答案 0 :(得分:1)
const Node*
不是const
指针。它是指向const Node
的指针。对许多人来说,这是一个混乱的来源。
您可以使用:
struct cmp1{
bool operator ()(Node* p1, Node* p2) const
{
return p1->num_ > p2->num_;
}
};
或
struct cmp1{
bool operator ()(Node* const & p1, Node* const & p2) const
{
return p1->num_ > p2->num_;
}
};
不要认为参数类型必须是const T &
,而是认为它必须是T const &
。然后,为什么const Node* &
不是正确的类型以及为什么Node* const &
是正确的类型将是有道理的。
答案 1 :(得分:1)
他们都有const T&amp;参数。
可能会让人感到困惑,但对于cmp1
,参数类型(即const Node *&
)不是const T&
(T==Node*
},应为Node* const&
。注意const指针(Node* const
)和指向const(const Node*
)的指针之间的区别。
sort(vec2.begin(), vec2.end(),cmp1());//error, why?
元素类型为Node*
,无法绑定到const Node* &
。由于Node*
和const Node*
不是同一类型,因此需要将其转换为const Node*
,这将是一个临时的,并且不能绑定到非常量的左值引用