Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使std::map比较以处理多种数据类型?_C++_Data Structures_Stl - Fatal编程技术网

C++ 如何使std::map比较以处理多种数据类型?

C++ 如何使std::map比较以处理多种数据类型?,c++,data-structures,stl,C++,Data Structures,Stl,我在std::deque中存储了整个表,我需要允许用户在任何列上对表进行排序。表格以列表框格式呈现给用户 每个记录由多个字符串组成(字符串结构)。但是,字段的类型不同,即时间(HH:MM:SS)、浮点和字符串,即使它们都存储为字符串 允许用户对这些列中的任何列进行排序。当用户单击该列时,我将每个记录存储在一个多重映射中,以便该表以排序格式显示给用户 但是,由于列的类型不同,如何编写一个比较方法来有效地处理所有这些问题 我想到了以下方法 对每个类型使用不同的映射,并为每个映射编写一个比较函数类 使

我在
std::deque
中存储了整个表,我需要允许用户在任何列上对表进行排序。表格以列表框格式呈现给用户

每个记录由多个字符串组成(字符串结构)。但是,字段的类型不同,即时间(HH:MM:SS)、浮点和字符串,即使它们都存储为字符串

允许用户对这些列中的任何列进行排序。当用户单击该列时,我将每个记录存储在一个多重映射中,以便该表以排序格式显示给用户

但是,由于列的类型不同,如何编写一个比较方法来有效地处理所有这些问题

我想到了以下方法

  • 对每个类型使用不同的映射,并为每个映射编写一个比较函数类
  • 使用一个映射和一个处理所有三种不同类型的比较类。但是对于每次插入,比较类必须确定类型,并相应地插入 有比这两个更好的方法吗

    例如:

    struct ltDataCompare
    {
    
        bool operator()( const CString& csData1, const CString& csData2)  const
        {
    
            if ( isTimeFormat(csData1) && isTimeFormat(csData1) )
            {
                   // Do time relevant comparision
                }
                else if ( isNumberFormat( csTime1 ) && isNumberFormat(csTime2) )
            {
                double dPrice1 = atof((LPCTSTR)csTime1);
                double dPrice2 = atof((LPCTSTR)csTime2);
    
                return ( dPrice1 < dPrice2);
            }
            return ( csTime1 < csTime2 );
        }
    };
    
    std::multimap<CString,list_record_t*,ltDataCompare> _mapAllRecords; // Used only for sorting
    
    struct ltDataCompare
    {
    布尔运算符()(常量CString和csData1、常量CString和csData2)常量
    {
    if(isTimeFormat(csData1)和&isTimeFormat(csData1))
    {
    //做时间相关比较
    }
    else if(isNumberFormat(csTime1)和&isNumberFormat(csTime2))
    {
    双dPrice1=atof((LPCTSTR)csTime1);
    双dPrice2=atof((LPCTSTR)csTime2);
    返回(dPrice1
    您不能对
    地图
    多地图
    重新排序-一旦插入项目,其位置将被锁定。最好使用不同的容器,如
    向量
    ,并在必要时对其进行排序

    比较类的优点是允许它包含state。您可以使用带有常量或指针的成员来确定使用哪种比较方法

    您可以使用相同的原则选择要排序的字段

    struct ltDataCompare 
    {
        ltDataCompare(int field, int method) : m_field(field), m_method(method) {}
        bool operator()( const record& left, const record& right) const 
        {
            if (m_method == enumTimeFormat)
                return CompareTimes(left[m_field], right[m_field]);
            else if (m_method == enumNumberFormat)
                return CompareNumbers(left[m_field], right[m_field]);
            // ...
        }
        int m_field;
        int m_method;
    };
    
    std::sort(table.begin(), table.end(), ltDataCompare(0, enumTimeFormat));
    

    如果你有一个类,每个类型都有一个<操作符,那么你可以更优雅一些——我不知道你会省下任何工作。如果您有一个具有虚拟运算符的超类,则可以将其用作键类型,如中所示

    std::multimap< superclass, list_record_t >
    
    std::multimap
    
    现在可以使用任何子类型作为实际键(只要保持一致)。
    实际上我不确定这是更聪明还是更优雅。更聪明通常是一件坏事(因为它意味着更模糊/更不易维护)。如果这样可以减少代码行数,这通常是一件好事。

    你在比较什么?例如,将浮点数与字符串进行比较有意义吗?编辑:对不起,我明白你的意思。您希望对记录中的一个或多个字段进行排序。好的,您可以使用一个字段枚举来完成这项工作,该字段枚举被传递到排序函数(或lambda)中,然后根据枚举值在比较函数中使用适当的值。您可以展示一个示例Robinson吗?Robinson,所有字段都存储为字符串。我需要确定字段的类型,并进行适当的排序/比较。Mark,我理解地图无法使用。我使用maps/multimap,只是为了保持记录的有序性。一旦这些被分类,我就不需要地图/多重地图了。我可以摧毁他们。你能展示一个例子/链接吗?你能展示一个例子/链接“你可以使用相同的原则来选择对哪个字段进行排序”。@user373215:如果你只使用它们进行排序,请使用一个常规容器(例如
    std::vector
    std::deque
    )+
    std::sort
    ,并完全抛弃关联容器。