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

从您的评论来看,您似乎需要一个容器来:

  • 存储包含 KCacheEntry<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;

(为简洁起见,代码假定所有相关的 #includeusing namespace 指令)。

以上代码不是复制&粘贴&使用的形式,但它应该是一个入门指南。您可以阅读 multi-index container 并以上述想法为基础来满足您的需求(例如为索引添加标签)。

索引的顺序(有序,然后是唯一)很重要 - 为了方便起见,容器本身继承了第一个索引的接口。在上述情况下,这将允许您将其视为按 getTime() 的结果排序的 DataItem 的集合,同时不允许 K.

的重复值

作为旁注,请注意您不需要将 now() 拖到比较器中。如果 (now - t1) < (now - t2),则只需 t2 > t1.