C ++结构问题

时间:2016-02-22 15:53:18

标签: c++ c++11 struct graph-theory

下面这部分的功能是什么?

bool operator < ( const edge& p ) const 
{
    return w < p.w;
}

我在这里提供完整代码(我不知道是否有必要粘贴整个代码)。我只是不了解结构部分。 我搜索了几个资源,但没有任何简单。

struct edge
{
    int u,v,w;
    bool operator < ( const edge& p ) const 
    {
        return w < p.w;
    }
};

int pr[MAXN];
vector<edge>e;

int find(int r)
{
    return (pr[r]==r) ? r:  find(pr[r]);
}

int mst(int n)
{
    sort(e.begin(),e.end());
    for(int i=1;i<=n;i++)pr[i]=i;

    int count=0,s=0;
    for(int i=0;i<(int)e.size();i++)
    {
        int u=find(e[i].u);
        int v=find(e[i].v);
        if(u!=v)
        {
            pr[u]=v;
            count++;
            s+=e[i].w;
            if(count==n-1) break;
        }
    }
    return s;
}

int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        cin>>u>>v>>w;
        edge get;
        get.u=u; get.v=v; get.w=w;
        e.push_back(get);
    }
    cout<<mst(n)<<endl;
    return 0;

}

1 个答案:

答案 0 :(得分:0)

考虑何时1 < 3。 1显然小于3.好吧,但是假设你有struct / class / union(注意3在C ++中几乎是相同的东西),称为Toy

struct Toy
{
  float _volume;
  float _weight;
  std::string _brand;
};

现在您实例化2个Toy个对象:

Toy car, kite;
car._volume = 27000.0; //27000 cm^3
car._weight = 150.0; //150 grams

kite._volume = 10000; //10000 cm^3
kite._weight = 200.0; // 200 grams

if (kite < car){
  std::cout << "car!"; // is toy car bigger!?
}else{
  std::cout << "kite!"; // or is it the kite?
}

现在,在那里,当你检查风筝是否比玩具车smaller时,C ++语言不知道你的意思。也许你想要看到哪个重量较轻,或者你可能正在检查哪个占用的空间较少;体积较小。为了解决这种歧义,C ++要求程序员为您的自定义对象实现运算符。

如果我们剥离了许多运算符设计的syntactic sugar部分,为了示例,让它小于(<),a < b变为a.operator<(b) 。所以operator<可以说是一个类/结构/联合方法,就像任何其他方法一样!

为了清除玩具示例中的歧义,我们重新实现/重载结构的operator<()方法,让它按如下方式比较卷:

struct Toy
{
  float _volume;
  float _weight;
  std::string _brand;
  bool operator<(const Toy & otherToy)
  {
    return _volume < otherToy._volume; // or ._weight for each if we want to compare by weight
  }
};

if (kite < car){
  std::cout << "car!"; // the car has more volume!
}else{
  std::cout << "kite!";
}

使用您的代码段,您可以看到在运算符&lt;中定义了edge对象比较标准。定义为成员w。因此,与该运算符相比,较小的w是较小的对象。