独自のデータ構造の重複した要素の削除

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic

独自のデータ構造の重複した要素の削除

#1

投稿記事 by dic » 15年前

あけましておめでとうございます

独自のデータ構造の重複した要素を削除しようと思い
下のコードを書きましたがコンパイルエラーがでて
コンパイルできません

STL内でエラーが起きてるようで手が出ません
どう対処すればいいでしょうか?
#include    <iostream>
#include    <vector>
#include    <algorithm>
using namespace std;

typedef    struct
{
    char    name[12];
    int        left;
    int        right;
} tLeaf;

int    main()
{
    vector<tLeaf>    vLeaf;
    tLeaf    leaf;

    int    i;
    for( i=0; i<10; i++ )
    {
        strcpy( leaf.name, "leaf" );
        leaf.left = -1;
        leaf.right = -1;
        vLeaf.push_back( leaf );
    }

    vector<tLeaf>::iterator p;
    p = unique( vLeaf.begin(), vLeaf.end() );

    return 0;
}

コンパイルエラーの内容です

c:\program files\microsoft visual studio\vc98\include\algorithm(57) : error C2784: 'bool __cdecl std::operator ==(const class std::istream_iterator<_U,_E,_Tr> &,const class std::istream_iterator<_U,_E,_Tr> &)' : 'const class std::istream_iterator<_U
,_E,_Tr> & 用のテンプレート引数を 'tLeaf' から減少できませんでした。
c:\program files\microsoft visual studio\vc98\include\algorithm(322) : コンパイルされたクラスのテンプレートのインスタンス化 'tLeaf *__cdecl std::adjacent_find(tLeaf *,tLeaf *)' の参照を確認してください
c:\program files\microsoft visual studio\vc98\include\algorithm(57) : error C2784: 'bool __cdecl std::operator ==(const class std::reverse_bidirectional_iterator<_BI,_Ty,_Rt,_Pt,_D> &,const class std::reverse_bidirectional_iterator<_BI,_Ty,_Rt,_Pt,_
D> &)' : 'const class std::reverse_bidirectional_iterator<_BI,_Ty,_Rt,_Pt,_D> & 用のテンプレート引数を 'tLeaf' から減少できませんでした。
c:\program files\microsoft visual studio\vc98\include\algorithm(322) : コンパイルされたクラスのテンプレートのインスタンス化 'tLeaf *__cdecl std::adjacent_find(tLeaf *,tLeaf *)' の参照を確認してください
c:\program files\microsoft visual studio\vc98\include\algorithm(57) : error C2784: 'bool __cdecl std::operator ==(const class std::vector<_Ty,_A> &,const class std::vector<_Ty,_A> &)' : 'const class std::vector<_Ty,_A> & 用のテンプレート引数を 'tLeaf' か
ら減少できませんでした。
c:\program files\microsoft visual studio\vc98\include\algorithm(322) : コンパイルされたクラスのテンプレートのインスタンス化 'tLeaf *__cdecl std::adjacent_find(tLeaf *,tLeaf *)' の参照を確認してください
c:\program files\microsoft visual studio\vc98\include\algorithm(57) : error C2784: 'bool __cdecl std::operator ==(const class std::allocator<_Ty> &,const class std::allocator<_U> &)' : 'const class std::allocator<_Ty> & 用のテンプレート引数を 'tLeaf' から
減少できませんでした。
c:\program files\microsoft visual studio\vc98\include\algorithm(322) : コンパイルされたクラスのテンプレートのインスタンス化 'tLeaf *__cdecl std::adjacent_find(tLeaf *,tLeaf *)' の参照を確認してください
c:\program files\microsoft visual studio\vc98\include\algorithm(57) : error C2784: 'bool __cdecl std::operator ==(const class std::istreambuf_iterator<_E,_Tr> &,const class std::istreambuf_iterator<_E,_Tr> &)' : 'const class std::istreambuf_iterator
<_E,_Tr> & 用のテンプレート引数を 'tLeaf' から減少できませんでした。
c:\program files\microsoft visual studio\vc98\include\algorithm(322) : コンパイルされたクラスのテンプレートのインスタンス化 'tLeaf *__cdecl std::adjacent_find(tLeaf *,tLeaf *)' の参照を確認してください
c:\program files\microsoft visual studio\vc98\include\algorithm(57) : error C2784: 'bool __cdecl std::operator ==(const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &,const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &)' : 'const class std::r
everse_iterator<_RI,_Ty,_Rt,_Pt,_D> & 用のテンプレート引数を 'tLeaf' から減少できませんでした。
c:\program files\microsoft visual studio\vc98\include\algorithm(322) : コンパイルされたクラスのテンプレートのインスタンス化 'tLeaf *__cdecl std::adjacent_find(tLeaf *,tLeaf *)' の参照を確認してください
c:\program files\microsoft visual studio\vc98\include\algorithm(57) : error C2784: 'bool __cdecl std::operator ==(const struct std::pair<_T1,_T2> &,const struct std::pair<_T1,_T2> &)' : 'const struct std::pair<_T1,_T2> & 用のテンプレート引数を 'tLeaf' か
ら減少できませんでした。
c:\program files\microsoft visual studio\vc98\include\algorithm(322) : コンパイルされたクラスのテンプレートのインスタンス化 'tLeaf *__cdecl std::adjacent_find(tLeaf *,tLeaf *)' の参照を確認してください
c:\program files\microsoft visual studio\vc98\include\algorithm(57) : error C2676: 二項演算子 '==' : 'tLeaf' は、この演算子または定義済の演算子に適切な型への変換の定義を行いません。 (新しい動作; ヘルプを参照)
c:\program files\microsoft visual studio\vc98\include\algorithm(322) : コンパイルされたクラスのテンプレートのインスタンス化 'tLeaf *__cdecl std::adjacent_find(tLeaf *,tLeaf *)' の参照を確認してください
cl.exe の実行エラー


使用コンパイラ:VC++6.0
OS:WindowsXP

MNS

Re:独自のデータ構造の重複した要素の削除

#2

投稿記事 by MNS » 15年前

std::uniqueにおいて、重複した要素を削除するには、==演算子の定義が必要です。
tLeaf構造体の==演算子を定義してください。

dic

Re:独自のデータ構造の重複した要素の削除

#3

投稿記事 by dic » 15年前

ちょっと難しいですね・・・
やってみます

MNS

Re:独自のデータ構造の重複した要素の削除

#4

投稿記事 by MNS » 15年前

いわゆる演算子のオーバーロードですが、同じとみなす条件を自由に設定できます。

たとえば、left変数が重複しているものを除きたければ、
typedef    struct
{
    char    name[12];
    int        left;
    int        right;
    
    bool operator==(const tLeaf& rhs)
    {
        if(rhs.left == this->left)
            return true;
        return false;
    }
} tLeaf;
(このような構造体の定義の仕方での演算子のオーバーロードをしたことがないので、
 動くかどうかはわかりませんが)
こんなのでいいと思います。

それとも、メンバ変数すべてが一致しているときを重複していると見なす場合は、
typedef    struct
{
    char    name[12];
    int        left;
    int        right;
    
    bool operator==(const tLeaf& rhs)
    {
        if(rhs.left == this->left
           && rhs.right == this->right
           && strcmp(rhs.name, this->name)==0)
            return true;
        return false;
    }
} tLeaf;
こうなりますかね

dic

Re:独自のデータ構造の重複した要素の削除

#5

投稿記事 by dic » 15年前

>MNSさん
解決しました
ありがとうございました


閉鎖

“C言語何でも質問掲示板” へ戻る