当两个模板参数时,如何为第二个参数排序std :: MAP?

时间:2015-01-16 11:21:35

标签: c++11 dictionary compare

怎么样?我发现了很多例子,但找不到带参数模板的例子。我不知何故没有比较作用。

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());
            }
        };

错误:

  

错误1错误C2664:&#39; bool   的DiaDoc ::缓存::比较   *&gt; :: operator()(const std :: pair&amp;,const std :: pair&amp;)const&#39; :无法从&#39; const std :: wstring&#39;转换参数1到#const;   std :: pair&amp;&#39; c:\ program files(x86)\ microsoft visual studio   12.0 \ vc \ include \ xutility 521 1 DiadocClient

我尝试使用:

template<typename T1, class T2>

但它太不起作用了。 按第二个参数地图排序。

2 个答案:

答案 0 :(得分:1)

不确定您要执行的操作,但std::map仅比较键(即示例代码中的类型K)。

您定义了一个比较一对的比较器,它不是std::map所需的,因此是错误。

如果您的地图可能包含多个具有相同密钥的条目,则应使用multimap代替。

答案 1 :(得分:1)

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

  • 存储包含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指令。

上面的代码不是copy&amp; paste&amp; use shape,但它应该是一个让你入门的指针。您可以阅读多索引容器并构建上述想法以满足您的需求(例如为索引添加标记)。

索引的顺序(有序,然后唯一)很重要 - 对于convenienec,容器本身继承了第一个索引的接口。在上述情况下,您可以将其视为按DataItem结果排序的getTime()集合,同时不允许K的重复值。


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