C++ 使用不同于默认排序类STL集合的迭代

C++ 使用不同于默认排序类STL集合的迭代,c++,stl,set,C++,Stl,Set,你能告诉我为什么这个代码不能按预期工作吗。 它应该以相反的顺序打印人物,但由于某些原因,它不会这样做 #include "stdafx.h" #include <set> #include <iostream> class Person { friend class AgeSorter; friend class AgeInversedSorter; private: int m_age; public: int GetAge() c

你能告诉我为什么这个代码不能按预期工作吗。 它应该以相反的顺序打印人物,但由于某些原因,它不会这样做

#include "stdafx.h"
#include <set>
#include <iostream>

class Person
{
    friend class AgeSorter;
    friend class AgeInversedSorter;

private:
    int m_age;

public:
    int GetAge() const
    {
        return m_age;
    }

    int operator == (const Person& otherPerson) const
    {
        return m_age - otherPerson.m_age;
    }

    Person(const Person& otherPerson)
    {
        m_age = otherPerson.m_age;
        std::cout << "Copy constructor called" << std::endl;
    }

    Person(int age) : m_age(age)
    {

    }
};

class AgeSorter
{
public:
    bool operator()(const Person& first, const Person& second) const
    {
        return first.m_age > second.m_age;
    }
};

class AgeInversedSorter
{
public:
    bool operator()(const Person& first, const Person& second) const
    {
        return first.m_age < second.m_age;
    }
};

typedef std::set<Person, AgeSorter>                     Persons;
typedef Persons::iterator                               PersonsDefaultIterator;
typedef std::set<Person, AgeInversedSorter>::iterator   PersonsInversedAgeIterator;

int _tmain(int argc, _TCHAR* argv[])
{
    Persons persons;
    Person person1(20);
    Person person2(10);

    persons.insert(person1);
    persons.insert(person2);

    std::cout << "Output using default iterator:" << std::endl;
    for (PersonsDefaultIterator iterator = persons.begin();
        iterator != persons.end();
        iterator++)
    {
        std::cout << iterator->GetAge() << std::endl;
    }

    std::cout << "Output using inversed iterator:" << std::endl;
    PersonsInversedAgeIterator iterator = persons.begin();
    for (PersonsInversedAgeIterator iterator = persons.begin();
        iterator != persons.end();
        iterator++)
    {
        std::cout << iterator->GetAge() << std::endl;
    }

    std::cout << "Press <Enter> to quit." << std::endl;
    getchar();
    return 0;
}
#包括“stdafx.h”
#包括
#包括
班主任
{
朋友分类机;
朋友级反向分拣机;
私人:
int m_年龄;
公众:
int GetAge()常量
{
返回m_年龄;
}
int运算符==(constperson和otherPerson)const
{
返回m_age-otherPerson.m_age;
}
人员(施工人员和其他人员)
{
m_年龄=其他人。m_年龄;

std::cout首先,您的代码是错误的

PersonsInversedAgeIterator iterator = persons.begin();
persons.begin()
的返回类型是
std::set::iterator
,而
personinversedageiterator
的返回类型是
std::set::iterator

其次,
AgeInversedSorter
是STL的默认顺序(
std::less
)。您的
AgeSorter
是STL的相反顺序(
std::less


因此,您应该将
Sorter
s编辑为您预期的顺序,并使用适当的容器和适当的迭代器。

首先,您的代码错误

PersonsInversedAgeIterator iterator = persons.begin();
persons.begin()
的返回类型是
std::set::iterator
,而
personinversedageiterator
的返回类型是
std::set::iterator

其次,
AgeInversedSorter
是STL的默认顺序(
std::less
)。您的
AgeSorter
是STL的相反顺序(
std::less


因此,您应该将
Sorter
s编辑为您预期的顺序,并使用适当的容器和适当的迭代器。

首先,您的代码错误

PersonsInversedAgeIterator iterator = persons.begin();
persons.begin()
的返回类型是
std::set::iterator
,而
personinversedageiterator
的返回类型是
std::set::iterator

其次,
AgeInversedSorter
是STL的默认顺序(
std::less
)。您的
AgeSorter
是STL的相反顺序(
std::less


因此,您应该将
Sorter
s编辑为您预期的顺序,并使用适当的容器和适当的迭代器。

首先,您的代码错误

PersonsInversedAgeIterator iterator = persons.begin();
persons.begin()
的返回类型是
std::set::iterator
,而
personinversedageiterator
的返回类型是
std::set::iterator

其次,
AgeInversedSorter
是STL的默认顺序(
std::less
)。您的
AgeSorter
是STL的相反顺序(
std::less

因此,您应该将
Sorter
s编辑为您期望的顺序,并使用适当的容器和适当的迭代器。

事实是:

PersonInversedAgiterator
是同一类型的
PersonDefaultIterator
,因此您的代码不会出错

要查看差异顺序,必须使用2组:

std::set<Person, AgeSorter> persons = {Person(20), Person(10)};
std::set<Person, AgeInversedSorter> reversePersons = {Person(20), Person(10)};
std::set persons={Person(20),Person(10)};
设置反向persons={Person(20),Person(10)};
事实是:

PersonInversedAgiterator
是同一类型的
PersonDefaultIterator
,因此您的代码不会出错

要查看差异顺序,必须使用2组:

std::set<Person, AgeSorter> persons = {Person(20), Person(10)};
std::set<Person, AgeInversedSorter> reversePersons = {Person(20), Person(10)};
std::set persons={Person(20),Person(10)};
设置反向persons={Person(20),Person(10)};
事实是:

PersonInversedAgiterator
是同一类型的
PersonDefaultIterator
,因此您的代码不会出错

要查看差异顺序,必须使用2组:

std::set<Person, AgeSorter> persons = {Person(20), Person(10)};
std::set<Person, AgeInversedSorter> reversePersons = {Person(20), Person(10)};
std::set persons={Person(20),Person(10)};
设置反向persons={Person(20),Person(10)};
事实是:

PersonInversedAgiterator
是同一类型的
PersonDefaultIterator
,因此您的代码不会出错

要查看差异顺序,必须使用2组:

std::set<Person, AgeSorter> persons = {Person(20), Person(10)};
std::set<Person, AgeInversedSorter> reversePersons = {Person(20), Person(10)};
std::set persons={Person(20),Person(10)};
设置反向persons={Person(20),Person(10)};


是的,我正在学习C++集合容器类型,只是检查STL是否对不同迭代器工作得很好。而且看到它不奇怪(或者我可能还不理解它)。排序在插入时发生。在那里,只有一个集合,没有逆的顺序。谢谢!就是这样!我理解逆序中的代码是为了使泛型算法运行。编译,是的,我正在学习C++集合容器类型,只是检查STL是否对不同的迭代器工作得很好。(或者我可能还不明白)排序在插入时发生。在那里,只有一个集合,没有逆的顺序。谢谢!就是这样!我理解逆序中的代码是为了使泛型算法运行。编译,是的,我正在学习C++集合容器类型,只是检查STL是否对不同的迭代器工作得很好。(或者我可能还不明白)排序在插入时发生。在那里,只有一个集合,没有逆的顺序。谢谢!就是这样!我理解逆序中的代码是为了使泛型算法运行。编译,是的,我正在学习C++集合容器类型,只是检查STL是否对不同的迭代器工作得很好。(或者我可能还不明白)排序发生在插入时。这里只有一个集合,没有反向排序。谢谢!就是这样!据我所知,反向排序的代码是为了使通用算法工作而编译的。@drweb86可能两个迭代器类型是偶然相同的;standard没有指定STL容器的迭代器类型。如果能够满足,它可以是任何类型标准…(例如,
std::vector::iterator
可能只是指针。)好的,ikh,非常感谢您!编译放松可能是为了使它与通用算法更具可比性。@drw