早上好,我正以正确的方式使用地图。
场合
具有唯一ID和其他两个代码的数据库表
ID (long) | Type (long) | Name (string)
正确填充地图我已经用这种方式定义了它:
map<long, MyObject>
其中key是我的ID,对象包含所有内容。地图工作正常,我加载所有行,我在其中轻松导航。
故障
当我需要使用不是关键的标准对行进行排序时,麻烦来了:
环顾互联网,我发现我应该:
我做了第1步,但没有成功(从未调用过)。我试图做到第二点,但成功率更低。 我会粘贴一些代码来帮助:
class CSitoWebRigaVariante
{
public:
bool m_bSriDelete;
bool m_bSriVisibile;
long m_lSriId;
long m_lSriIdTipol;
long m_lSriCodGes;
CString m_strSriCodMat;
public:
CSitoWebRigaVariante(void);
CSitoWebRigaVariante(const CSitoWebRigaVariante& cRiga);
~CSitoWebRigaVariante(void);
bool operator<(const CSitoWebRigaVariante& cRiga);
void operator=(const CSitoWebRigaVariante& cRiga);
void Azzera(void);
static void CaricaDaMDB(CDB* pDB, long lIdVM, map<long, CSitoWebRigaVariante>& cRighe);
};
typedef map<long, CSitoWebRigaVariante> CSWRighe;
///> Static method to fill a map.
void CSitoWebRigaVariante::CaricaDaMDB(CADODatabase* pDB, long lIdVM, map<long, CSitoWebRigaVariante>& cRighe)
{
BOOL bValRit;
CRecordset* pRS;
CSitoWebRigaVariante riga;
CString strInt;
pRS = new CADORecordset(pDB);
strInt.Format(_T("SELECT * FROM SITOWEB_RIVARMAT WHERE sri_idvarmat = %ld;"), lIdVM);
cRighe.clear();
if (pRS->Open(strInt, CADORecordset::openQuery) == TRUE && pRS->GetRecordCount() > 0)
{
while (pRS->IsEOF() == FALSE)
{
bValRit = pRS->GetFieldValue(_T("sri_id"), riga.m_lSriId);
bValRit &= pRS->GetFieldValue(_T("sri_idtipol"), riga.m_lSriIdTipol);
bValRit &= pRS->GetFieldValue(_T("sri_codges"), riga.m_lSriCodGes);
bValRit &= pRS->GetFieldValue(_T("sri_codmat"), riga.m_strSriCodMat);
bValRit &= pRS->GetFieldValue(_T("sri_delete"), riga.m_bSriDelete);
bValRit &= pRS->GetFieldValue(_T("sri_visibile"), riga.m_bSriVisibile);
cRighe.insert(pair<long, CSitoWebRigaVariante>(riga.m_lSriCodGes, riga));
pRS->MoveNext();
}
}
pRS->Close();
delete pRS;
}
我正在使用Visual Studio 2010,MFC。 任何帮助表示赞赏。
答案 0 :(得分:1)
std::map
不是多索引关联容器。其find
方法(以及其他内容)使用密钥作为搜索条件。没有可能指定其他搜索条件。这就是为什么它是一个&#34;单索引查找表&#34;。
您可以使用Boost.MultiIndex。它专为您的案例而设计,支持多个索引(顾名思义),既独特又不独特。
或者您可以使用具有不同键的多个地图实例。如果密钥不是唯一的,则需要std::multimap
。
答案 1 :(得分:0)
我建议你使用map for model(用于存储数据)。当您需要显示信息时,您可以按照需要显示的顺序输出信息。排序必须不是在存储项目的级别,而是在显示它们的级别。 虽然,在每种情况下,您只需要重新排序一次。
此外,如果感谢任何帮助,我强烈建议您做一个
typedef long MyId;
并使用VS 2015。
答案 2 :(得分:0)
map
类提供构造函数的Compare参数。您无法通过设置比较来完成目标,因为map
仅具有支持键比较功能。
我的第一个想法是构建一个类支持你的表模式。
class Example
{
public:
<your code>
void sortByID();
void sortByType();
void sortByName();
private:
long ID_;
long Type_;
string Name_;
};
但听起来很糟糕。一旦你的桌子改变了,你就应该硬拷贝。所以为什么你只是使用数据库order by
获得结果?