回 帖 发 新 帖 刷新版面

主题:问一个关于stl和set_union得问题。。。

查了点资料还是有点困惑。。。问题如下:


#include<iostream>
#include<set>
#include<algorithm>

using namespace std;

struct test
{
    int i;
    double j;
    test(){}
    test(int a, int b):i(a),j(b){}

    void show()
    {
        cout<<"("<<i<<","<<j<<")"<<endl;
    }

    bool operator > (const test &b)//后面编译无法通过,显示小于号没有重载。。。很困惑,这是第一个问题

    {
        if(this->i>b.i)
            return true;
        else
        {
            if(this->i==b.i && this->j>b.j)
                return true;
            else
                return false;
        }
    }

    bool operator < (const test &b)
    {
        if(this->i<b.i)
            return true;
        else
        {
            if(this->i==b.i && this->j<b.j)
                return true;
            else
                return false;
        }
    }
};

/*struct KeyComp //这里如果不作为注释并且声明时候为 set<test, KeyComp>,那么编译可以通过且可以正常运行。。。,第一个问题可以解决。。但不明白为什么符号没有重载

{
    bool operator () (const test &a, const test &b)
    {
        if(a.i>b.i)
            return true;
        else
        {
            if(a.i==b.i && a.j>b.j)
                return true;
            else
                return false;
        }

    }

};*/


int a[] = {7,3,7,1,6};
int b[] = {1,4,2,7,6};
int c[] = {1,4,2,6,7};
int d[] = {3,2,7,4,9};

int main()
{
    struct test t;
    set<test, KeyComp> set1, set2, result;
    set<test, KeyComp>::iterator it;
    
    for(int i=0; i<5; i++)
    {
        t.i = a[i];
        t.j = b[i];
        set1.insert(t);
        t.i = c[i];
        t.j = d[i];
        set2.insert(t);
    }
        

    
    for(it=set1.begin(); it!=set1.end(); it++)
        (*it).show();
    cout<<endl<<endl;
    for(it=set2.begin(); it!=set2.end(); it++)
        (*it).show();

    //set_union( set1.begin(), set1.end(), set2.begin(), set2.end(), inserter( result, result.begin() ) );

    //for(it=result.begin(); it!=result.end(); it++)
        //(*it).show();
}



在上面可以正常运行的情况下(也就是KeyComp不作为注释),如果运行set_union的话出来红叉子显示运行错误。。。这是第二个问题
环境是VC2005.

多谢了,bow~

回复列表 (共2个回复)

沙发

#include <iostream>

struct test
{
    int i;
    double j;

    test() : i(0), j(0.0)
    {
    }
    test( int a, int b ) : i(a), j(b)
    {
    }

    bool operator< ( const test& rhs ) const
    {
        if( i < rhs.i )
            return true;
        if( i > rhs.i )
            return false;
        return j < rhs.j;
    }
};
std::ostream& operator<< ( std::ostream& os, const test& rhs )
{
    return os << '(' << rhs.i << ',' << rhs.j << ')';
}

#include <set>
#include <algorithm>
using namespace std;

int main()
{
    int a[] = {7,3,7,1,6};
    int b[] = {1,4,2,7,6};
    int c[] = {1,4,2,6,7};
    int d[] = {3,2,7,4,9};

    set<test> set1, set2;
    for( int i=0; i<5; ++i )
    {
        set1.insert( test(a[i],b[i]) );
        set2.insert( test(c[i],d[i]) );
    }

    for( set<test>::iterator itor=set1.begin(); itor!=set1.end(); ++itor )
        cout << *itor << '\n';
    cout << '\n' << endl;

    for( set<test>::iterator itor=set2.begin(); itor!=set2.end(); ++itor )
        cout << *itor << '\n';
    cout << '\n' << endl;

    set<test> result;
    set_union( set1.begin(), set1.end(), set2.begin(), set2.end(), inserter( result, result.begin() ) );

    for( set<test>::iterator itor=result.begin(); itor!=result.end(); ++itor )
        cout << *itor << '\n';
}

板凳

&#38750;&#24120;&#24863;&#35874;~

我来回复

您尚未登录,请登录后再回复。点此登录或注册