C ++地图比较

时间:2015-11-13 10:27:27

标签: c++ visual-studio-2010 stdmap

早上好,我正以正确的方式使用地图。

场合

具有唯一ID和其他两个代码的数据库表

ID (long) | Type (long) | Name (string)

正确填充地图我已经用这种方式定义了它:

map<long, MyObject>

其中key是我的ID,对象包含所有内容。地图工作正常,我加载所有行,我在其中轻松导航。

故障

当我需要使用不是关键的标准对行进行排序时,麻烦来了:

  1. 类型
  2. 名称
  3. 环顾互联网,我发现我应该:

    1. 定义运算符&lt;对于MyObject或......
    2. 为我的地图定义另一种比较器。
    3. 我做了第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。 任何帮助表示赞赏。

3 个答案:

答案 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获得结果?