std::MAP为两个模板参数时如何为第二个参数排序?
How to sort std :: MAP for the second parameter when the two template parameters?
怎么办?我找了很多例子,但是找不到带参数模板的例子。我不知何故没有工作比较器。
std::map<K, CacheEntry<T>*, Comparator<K, CacheEntry<T>>> timeMap_;
template<typename T1, typename T2>
struct Comparator
{
typedef std::pair<T1, T2> type;
bool operator()(const type& l, const type& r) const
{
auto nowTime = std::chrono::system_clock::now();
auto timeL = nowTime - l.second->creationTime();
auto timeR = nowTime - r.second->creationTime();
return (std::chrono::duration_cast<std::chrono::microseconds>(timeL).count() > std::chrono::duration_cast<std::chrono::microseconds>(timeR).count());
}
};
错误:
Error 1 error C2664: 'bool
diadoc::cache::Comparator
*>::operator ()(const std::pair &,const std::pair &) const' : cannot convert argument 1 from 'const std::wstring' to 'const
std::pair &' c:\program files (x86)\microsoft visual studio
12.0\vc\include\xutility 521 1 DiadocClient
我尝试使用:
template<typename T1, class T2>
但是太不行了。
按第二个参数map.
排序
不确定您要做什么,但 std::map
仅比较键(即示例代码中的类型 K
)。
您定义了一个比较一对的比较器,这不是 std::map
所需要的,因此出现了错误。
如果您的地图可能包含多个具有相同键的条目,您应该改用 multimap
。
从您的评论来看,您似乎需要一个容器来:
- 存储包含
K
和 CacheEntry<T>
的对象
- 不允许两个对象具有相同的值
K
- 根据
CacheEntry<T>
对对象进行排序
没有直接支持这个的标准容器。你可以使用 boost::multi_index_container
,像这样:
typedef std::pair<K, CacheEntry<T>*> DataItem;
MyTimeType getTime(const DataItem &item)
{
return getTimeSomehowFrom(item);
}
typedef multi_index_container<
DataItem,
indexed_by<
ordered_non_unique<global_fun<DataItem, MyTimeType, &getTime>>,
hashed_unique<member<DataItem, K, &DataItem::first>>
>
> MyContainer;
(为简洁起见,代码假定所有相关的 #include
和 using namespace
指令)。
以上代码不是复制&粘贴&使用的形式,但它应该是一个入门指南。您可以阅读 multi-index container 并以上述想法为基础来满足您的需求(例如为索引添加标签)。
索引的顺序(有序,然后是唯一)很重要 - 为了方便起见,容器本身继承了第一个索引的接口。在上述情况下,这将允许您将其视为按 getTime()
的结果排序的 DataItem
的集合,同时不允许 K
.
的重复值
作为旁注,请注意您不需要将 now()
拖到比较器中。如果 (now - t1) < (now - t2)
,则只需 t2 > t1
.
怎么办?我找了很多例子,但是找不到带参数模板的例子。我不知何故没有工作比较器。
std::map<K, CacheEntry<T>*, Comparator<K, CacheEntry<T>>> timeMap_;
template<typename T1, typename T2>
struct Comparator
{
typedef std::pair<T1, T2> type;
bool operator()(const type& l, const type& r) const
{
auto nowTime = std::chrono::system_clock::now();
auto timeL = nowTime - l.second->creationTime();
auto timeR = nowTime - r.second->creationTime();
return (std::chrono::duration_cast<std::chrono::microseconds>(timeL).count() > std::chrono::duration_cast<std::chrono::microseconds>(timeR).count());
}
};
错误:
Error 1 error C2664: 'bool diadoc::cache::Comparator *>::operator ()(const std::pair &,const std::pair &) const' : cannot convert argument 1 from 'const std::wstring' to 'const std::pair &' c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility 521 1 DiadocClient
我尝试使用:
template<typename T1, class T2>
但是太不行了。 按第二个参数map.
排序不确定您要做什么,但 std::map
仅比较键(即示例代码中的类型 K
)。
您定义了一个比较一对的比较器,这不是 std::map
所需要的,因此出现了错误。
如果您的地图可能包含多个具有相同键的条目,您应该改用 multimap
。
从您的评论来看,您似乎需要一个容器来:
- 存储包含
K
和CacheEntry<T>
的对象
- 不允许两个对象具有相同的值
K
- 根据
CacheEntry<T>
对对象进行排序
没有直接支持这个的标准容器。你可以使用 boost::multi_index_container
,像这样:
typedef std::pair<K, CacheEntry<T>*> DataItem;
MyTimeType getTime(const DataItem &item)
{
return getTimeSomehowFrom(item);
}
typedef multi_index_container<
DataItem,
indexed_by<
ordered_non_unique<global_fun<DataItem, MyTimeType, &getTime>>,
hashed_unique<member<DataItem, K, &DataItem::first>>
>
> MyContainer;
(为简洁起见,代码假定所有相关的 #include
和 using namespace
指令)。
以上代码不是复制&粘贴&使用的形式,但它应该是一个入门指南。您可以阅读 multi-index container 并以上述想法为基础来满足您的需求(例如为索引添加标签)。
索引的顺序(有序,然后是唯一)很重要 - 为了方便起见,容器本身继承了第一个索引的接口。在上述情况下,这将允许您将其视为按 getTime()
的结果排序的 DataItem
的集合,同时不允许 K
.
作为旁注,请注意您不需要将 now()
拖到比较器中。如果 (now - t1) < (now - t2)
,则只需 t2 > t1
.