在std :: map中使用std :: tm作为Key

时间:2011-05-12 13:58:30

标签: c++ map key function-object

我想使用std :: tm()作为std :: map-container的键。 但是当我尝试编译它时,我得到了很多(10)错误。

例如:

1

  

错误C2784:'bool std :: operator   ≤(const的   的std :: basic_string的< _Elem,_Traits,_Alloc>   &,const _Elem *)':无法演绎   'const的模板参数   的std :: basic_string的< _Elem,_Traits,_Alloc>   &安培;”来自'const tm'c:\ program files   (x86)\ microsoft visual studio   10.0 \ vc \ include \ xfunctional 125

2

  

错误C2784:'bool std :: operator   <(const _Elem *,const   的std :: basic_string的< _Elem,_Traits,_Alloc>   &)':无法推断模板   来自'const _Elem *'的参数   'const tm'c:\ program files   (x86)\ microsoft visual studio   10.0 \ vc \ include \ xfunctional 125

3

  

错误C2784:'bool std :: operator   <(const std :: vector< _Ty,_Ax>&,const   的std ::矢量< _Ty,_AX> &)':不能   推导'const。的模板参数   的std ::矢量< _Ty,_AX> &安培;”来自'const   tm'c:\ program files(x86)\ microsoft   视觉工作室   10.0 \ vc \ include \ xfunctional 125

这一切是否意味着,我“只是”必须创建一个比较两个std :: tm的函数对象,因为没有为此定义标准比较? 还是有另一招? (或者对我来说甚至可能不可能?^^)

代码:

#include <map>
#include <ctime>
#include <string>


int main()
{
    std::map<std::tm, std::string> mapItem;
    std::tm TM;

    mapItem[TM] = std::string("test");
    return 0;
};

4 个答案:

答案 0 :(得分:8)

std::map使用比较器检查密钥是否已存在。所以当你使用std::tm时,你也要提供一个比较器作为第三个参数。

template < class Key, class T, class Compare = less<Key>,
           class Allocator = allocator<pair<const Key,T> > > class map

因此,解决方案将是仿函数(正如您已经猜到的那样):

struct tm_comparer
{
   bool operator () (const std::tm & t1, const std::tm & t2) const
   {           //^^ note this

        //compare t1 and t2, and return true/false
   }
};

std::map<std::tm, std::string, tm_comparer> mapItem;
                             //^^^^^^^^^^ pass the comparer!

或者将自由函数(operator <)定义为:

bool operator < (const std::tm & t1, const std::tm & t2)
{          // ^ note this. Now its less than operator

    //compare t1 and t2, and return true/false
};

std::map<std::tm, std::string> mapItem; //no need to pass any argument now!

答案 1 :(得分:2)

std::tm未定义<运算符。

答案 2 :(得分:2)

自由函数就足够了,你不需要函数对象。

答案 3 :(得分:2)

是的,您需要定义运算符&lt;对于tm结构。例如,请参阅http://www.cplusplus.com/reference/stl/map/map/(页面底部)。