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
,并完全抛弃关联容器。