首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >set,and compering/sorting functor或less运算符

set,and compering/sorting functor或less运算符
EN

Stack Overflow用户
提问于 2013-02-15 00:12:36
回答 2查看 2K关注 0票数 0

我对set有问题。我不知道我做错了什么。也许你们中有人能帮我。所以让我们开始吧,我的程序的输出应该是:

代码语言:javascript
复制
Iksinski Adam, Kowalski Jan, Nowak Adam, Nowak Jan,

所以它按第一个字符串排序。

下面是我的程序:

代码语言:javascript
复制
#include <set>
#include <iterator>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
class Person{
public:
Person(){}
Person(string v , string v1):nazw(v),imie(v1){}
bool operator<(const Person & K) const
{
    return ((this->getN()>K.getN())?0:1);
    //return ((this->getN()<K.getN())?1:0);
}
string getN()const
{
    return nazw;
}
/*
bool operator()(Person & K, Person & K1)
{
    return ((K->getN()<K1.getN())?1:0);
}
*/
friend ostream& operator<<(ostream & o , const Person&K)
{
    o << K.nazw << " " << K.imie;
    return o;
}
private:
string nazw,imie;
};
struct cmp
{
    bool operator()(const Person &K , const Person &K1)
    {
        return ((K.getN()<K.getN())?1:0);
    }
};
int main()
{
//typedef set<Person> kontener_typ;
typedef set<Person,cmp> kontener_typ;
kontener_typ c;
c.insert(Person("Nowak","Jan"));
c.insert(Person("Nowak","Adam"));
c.insert(Person("Kowalski","Jan"));
c.insert(Person("Nowak","Adam"));
c.insert(Person("Iksinski","Adam"));
std::copy (c.begin(), c.end(), ostream_iterator<Person>(cout, " ,"));
std::cout << std::endl;
}

好的,所以在main中,我只能编辑typdef和copy函数(但我需要用它来输出集合)。就像你看到的那样,我试着亲自重载operator< (因为设置compering人对人),但它不起作用。我也尝试使用functor,但输出结果如下所示

代码语言:javascript
复制
Iksinski Adam ,Nowak Adam ,Kowalski Jan ,Nowak Adam ,Nowak Jan ,

所以第二个字符串应该被删除。

祝你好运:)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-15 00:36:02

您必须按姓氏和名字进行比较:

代码语言:javascript
复制
bool operator<(const Person & other) const
{
    if ( getN() < other.getN() )
      return true;
    if ( other.getN() < getN() )
      return false;
    if ( imie < other.imie() )
      return true;
    return false;
}

或者,如果您想使用struct cmp

代码语言:javascript
复制
struct cmp
{
    bool operator()(const Person &K , const Person &K1)
    {
      if (K.getN() < K1.getN())
        return true;
      if(K1.getN() < K.getN())
        return false;
      if(K.imie < K1.imie) // will need a friend declaration or a getter() func
        return true;
      return false;
    }
}

如果你有C++的std::tie,那么这两个函数的内部都会变得简单得多:

代码语言:javascript
复制
return std::tie(nazw, imie) < std::tie(other.nazw, other.imie);
return std::tie(K.nazw, K.imie) < std::tie(K1.nazw, K1.imie);
票数 0
EN

Stack Overflow用户

发布于 2013-02-15 00:16:01

您的代码正在使用比较器cmp函数器对象。这里面有一个bug:

代码语言:javascript
复制
struct cmp
{
    bool operator()(const Person &K , const Person &K1)
    {
        // one of these _should_ be K1
        return ((K.getN()<K.getN())?1:0);
    }
};

我喜欢用一种比较容易理解的方式来命名变量,例如:

代码语言:javascript
复制
struct cmp
{
    bool operator()(const Person &left , const Person &right)
    {
        return left.getN() < right.getN();
    }
};

这澄清了(至少对我而言)运算符是这样比较的:left < right

但是,您还需要将“名字”作为次要条件进行排序,这将使函数看起来如下所示:

代码语言:javascript
复制
struct cmp
{
    bool operator()(const Person &left , const Person &right)
    {
        if(left.getN() < right.getN())
           return true;
        else if(left.getN() > right.getN())
           return false;
        // assuming the getI() function returns the first name,
        // just as the getN() function returns the last name
        else if(left.getI() < right.getI())  
           return true;
        else
           return false;
    }
};
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14879123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档