慢多集的矢量版本
vector version of slow multiset
我想根据一些标准(根据项目的大小)对我的对象进行排序
我在 multiset 中的 funcSort 会减慢计算速度并使解决方案无法扩展。我怎样才能让它更快?
为了避免这种情况,我尝试使用矢量,对其进行排序(应该更快?)并将其更改为多重集。但是我的解决方案不起作用,我不确定我做错了什么?
函数参数:
void deliver(const std::set<MyItem::Ptr> items, MyItem::Ptr item)
(shared_ptr 的类型定义):
typedef boost::shared_ptr<MyItem> Ptr;
排序函数:
auto funcSort = [item](MyItem::Ptr lhs, MyItem::Ptr rhs){
return lhs->howFar(item->howBig()) < rhs->howFar(item->howBig());
};
原始多集(使用 funcSort 时速度慢):
std::multiset<MyItem::Ptr, decltype(funcSort)> sortedItems(funcSort);
for (MyItem::Ptr item : items){
sortedItems.insert(item);
}
我的向量尝试(错误消息):
std::vector<MyItem::Ptr> sortedItems;
for (MyItem::Ptr item : items)
{
sortedItems.push_back(item);
}
std::sort(sortedItems.begin(), sortedItems.end(), funcSort());
std::multiset<MyItem::Ptr> ms(sortedItems.begin(), sortedItems.end());
错误信息:
__lambda1
auto funcSort = [item](MyItem::Ptr lhs, MyItem::Ptr rhs)
candidate expects 2 arguments, 0 provided
你的排序调用有误。您只想传递 funcSort
,而不是调用它。
这样试试:
std::sort(sortedItems.begin(), sortedItems.end(), funcSort);
我想根据一些标准(根据项目的大小)对我的对象进行排序 我在 multiset 中的 funcSort 会减慢计算速度并使解决方案无法扩展。我怎样才能让它更快? 为了避免这种情况,我尝试使用矢量,对其进行排序(应该更快?)并将其更改为多重集。但是我的解决方案不起作用,我不确定我做错了什么?
函数参数:
void deliver(const std::set<MyItem::Ptr> items, MyItem::Ptr item)
(shared_ptr 的类型定义):
typedef boost::shared_ptr<MyItem> Ptr;
排序函数:
auto funcSort = [item](MyItem::Ptr lhs, MyItem::Ptr rhs){
return lhs->howFar(item->howBig()) < rhs->howFar(item->howBig());
};
原始多集(使用 funcSort 时速度慢):
std::multiset<MyItem::Ptr, decltype(funcSort)> sortedItems(funcSort);
for (MyItem::Ptr item : items){
sortedItems.insert(item);
}
我的向量尝试(错误消息):
std::vector<MyItem::Ptr> sortedItems;
for (MyItem::Ptr item : items)
{
sortedItems.push_back(item);
}
std::sort(sortedItems.begin(), sortedItems.end(), funcSort());
std::multiset<MyItem::Ptr> ms(sortedItems.begin(), sortedItems.end());
错误信息:
__lambda1
auto funcSort = [item](MyItem::Ptr lhs, MyItem::Ptr rhs)
candidate expects 2 arguments, 0 provided
你的排序调用有误。您只想传递 funcSort
,而不是调用它。
这样试试:
std::sort(sortedItems.begin(), sortedItems.end(), funcSort);