全部。我正在尝试使用std::multiset
在插入时进行自动排序。它的元素是std::shared_ptr
至DataCell
个对象。这是头文件中的代码:
#include <iostream>
#include <string>
#include <set>
#include <memory>
class DataCell
{
public:
double _cartesianDistance;
};
typedef std::shared_ptr<DataCell> DataCellPtr;
bool operator<(const DataCellPtr &d1, const DataCellPtr &d2) {
std::cout << "lalala" << std::endl;
return d1->_cartesianDistance < d2->_cartesianDistance;
}
typedef std::multiset<DataCellPtr, std::less<DataCellPtr>> DataCellPtrMultiset;
int main(){
DataCellPtr d1( new DataCell );
DataCellPtr d2( new DataCell );
d1->_cartesianDistance = 1.0;
d2->_cartesianDistance = 2.0;
DataCellPtrMultiset dms;
dms.insert( d1 );
dms.insert( d2 );
}
预期输出:
lalala
lalala
一切正常,除了我的自定义排序未执行之外,因为我应该将"lalala"
打印到我的std::out
上,但这是没有发生的。我认为多集正在使用shared_ptr
的默认顺序。 _cartesianDistance
成员是双精度型。问题:如何覆盖默认的shared_ptr
顺序?
答案 0 :(得分:3)
代替使用std::less
,只需提供自己的比较器对象即可:
struct DataCellPtrComparison
{
bool operator() (const DataCellPtr &d1, const DataCellPtr &d2) const {
std::cout << "lalala" << std::endl;
return d1->_cartesianDistance < d2->_cartesianDistance;
}
};
typedef std::multiset<DataCellPtr, DataCellPtrComparison> DataCellPtrMultiset;
您无法在自己的命名空间中“覆盖” operator<
中现有的std::shared_ptr
,因为它已经在namespace std
中定义,并且可以在ADL之前找到在不同名称空间中具有相同签名的功能。