2017-08-10 64 views
-1

構造体をキーとして使用する単純なマップを作成しますが、実行中にクラッシュします。 問題を指摘できますか?本当にありがとう。構造体のキーの原因クラッシュでマップを使用

アイテムを3番目に置くとコードがクラッシュします。

... 
typedef struct pmjob 
{ 
    std::string jobId; 
    std::string jobGroup; 
    int reportingPeriod; 
    int compressionType; 
    bool operator == (const struct pmjob &other) const 
    { 
     return ((jobGroup.compare(other.jobGroup) == 0) && (reportingPeriod == other.reportingPeriod)); 
    } 

    bool operator < (const struct pmjob &other) const 
    { 
     if (reportingPeriod < other.reportingPeriod) 
     { 
      if(jobGroup.compare(other.jobGroup) == 0) 
       return false; 
     } 
     return true; 
     //return ((reportingPeriod < other.reportingPeriod) || (jobGroup.compare(other.jobGroup))); 
    } 
}PMJob; 

typedef std::map<PMJob, int> PMJobMap; 
PMJobMap List; 
typedef std::pair<PMJob, int> PMJobPair; 

答えて

0

コンパレータが無効です。

bool operator < (const struct pmjob &other) const

それは厳しい弱い順序付けを提供していません。有効なコンパレータの

例:

bool operator < (const struct pmjob &other) const 
{ 
    // first compare most important member 
    if (reportingPeriod < other.reportingPeriod) { 
     return false; 
    } 
    if (other.reportingPeriod < reportingPeriod) { 
     return true; 
    } 

    // less important member 
    if (compressionType < other.compressionType) { 
     return false; 
    } 
    if (other.compressionType < compressionType) { 
     return true; 
    } 

    if (jobId < other.jobId) { 
     return false; 
    } 
    if (other.jobId < jobId) { 
     return true; 
    } 

    if (jobGroup < other.jobGroup) { 
     return false; 
    } 
    if (other.jobGroup < jobGroup) { 
     return true; 
    } 

    return false; 
} 

またはstd::tieを使用して:

bool operator < (const struct pmjob &other) const 
{ 
    return std::tie(jobId, jobGroup, reportingPeriod, compressionType) < 
     std::tie(other.jobId, other.jobGroup, other.reportingPeriod, other.compressionType); 
} 
+0

あなたは一つの方法を提案してもらえますか? –

+0

@doccocobai答えは – ikleschenkov

+0

です。ありがとう@ikleschenkov。私たちはstructのすべての文字列を比較する必要がありますか?私はそれをチェックします。しかし、私は単にreportingPeriodとjobGroupをキーとして使用するだけですか?私はjobIdとcompressionTypeを気にしないという意味です。 –

関連する問題