2011-12-24 7 views
1

こんにちは私はC + +の初心者です。 このプログラムをコンパイルした後、エラーメッセージが表示されます。エラーをC++のコンテナを使用して

assign3_3.cpp:120:9: error: could not convert 'sPair' from 'std::set<pairT, clas 
scomp>' to 'std::set<pairT>' 

ここに私のコードです。

#include <set> 
#include <string> 
#include <iostream> 
using namespace std; 


struct pairT 
{ 
    string first, second; 
}; 

struct classcomp 
{ 
bool operator() (const pairT &lhs, const pairT &rhs) const 
{ 
    if (lhs.first == rhs.first && lhs.second == rhs.second) 
    { 
     return 0; 
    } 
    else if (lhs.first < rhs.first) 
    { 
     return -1; 
    } 
    else if (lhs.first == rhs.first && lhs.second < rhs.second) 
    { 
     return -1; 
    } 
    else 
    { 
     return 1; 
    } 
    } 
}; 

set<pairT> CartesianProduct(set<string> & one, set<string> & two); 

int main() 
{ 

    string A = "ABC"; 
    string B = "XY"; 
    set<string> sA, sB; 
    sA.insert(&A[0]); 
    sA.insert(&A[1]); 
    sA.insert(&A[2]); 
    sA.insert(&B[0]); 
    sA.insert(&B[1]); 
    set<pairT> pT = CartesianProduct(sA, sB); 
    //for (set<pairT>::iterator it = pT.begin(); it != pT.end(); it++) 
    // cout << pT.find(it).first << pT.find(it).second << endl; 

    return 0; 
} 


set<pairT> CartesianProduct(set<string> &one, set<string> &two) 
{ 
    set<string>::iterator itA, itB; 
    pairT pT; 
    set<pairT, classcomp> sPair; 

for (itA = one.begin(); itA != one.end(); itA++) 
{ 
    //cout << *itA << endl; 
    for(itB = two.begin(); itB != two.end(); itB++) 
    { 
     pT.first = *itA; 
     pT.second = *itB; 
     sPair.insert(pT); 
    } 
} 
return sPair; 
} 

まず、pairTの比較機能の作成についてはわかりません。 ここに該当する場合は、説明してください。 私は、コンテナを使用して問題を抱えています。ありがとう、メリークリスマスを助けてください!

+1

考えてみましょう: 'std :: set >'を使ってください。これは、*あなたの部分に*余分なコードなしで動作します。 '#include '、 ''、 ''が必要です。 –

答えて

3

比較器は、タイプのの一部です。あなたはどこにでもset<pairT, classcomp>と言う必要があります。 typedefを使うのがベストです。

+0

さらに簡単に、 'operator <' – wilhelmtell

+0

@wilhelmtellを使用してください:まあ、どんな深刻な状況でも、私はこれを何もしませんし、私のコメントで言いますように:-) –

+0

ああはい、私も同様です。 :) – wilhelmtell

0

Kerrek SBが述べたことに加えて、比較機能が正しくありません。

return lhs.first < rhs.first || 
    !(rhs.first < lhs.first) && lhs.second < rhs.second; 

幸いなことに、これは標準ライブラリで定義されているかstd::pair::operator<です:これは、よりコンパクトに表現することができる

if (lhs.first < rhs.first) 
    return true; 
else if (lhs.first == rhs.first && lhs.second < rhs.second) 
    return true; 
else 
    return false; 

std::set<std::pair>で必要とされるコンパレータは、以下の論理に従ってくださいする必要があります。 std::set<std::pair>を作成すると、この演算子がデフォルトで使用されるため、独自の演算子を指定する必要はありません。

+0

'operator <'と 'operator =='の定義が互換性があるかどうか分からないので、後者は前者より厳密に「コンパクト」ではありません。 (理由はありません)。後者は唯一の正しいジェネリックバージョンとみなすべきです。 –

関連する問題