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

我想使用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>的模板参数。 &'from'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 tm'推导出'const _Elem *'的模板参数c:程序文件(x86) microsoft visual studio 10.0 vc include xfunctional 125

3。

错误C2784:'bool std :: operator <(const std :: vector <_Ty,_Ax>&,const std :: vector <_Ty,_Ax>&)':无法推导出'const std :: vector < _Ty,_Ax>&'from'const tm'c: program files(x86) microsoft visual studio 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;
};

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!

std::tm没有定义<运算符。


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

链接地址: http://www.djcxy.com/p/68421.html

上一篇: Using std::tm as Key in std::map

下一篇: tuple in C++0x