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

标签 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() 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;
}

正如我所见,默认排序器在插入元素时被调用,但是没有排序器 functionoids 在以第一种方式(完全没问题)和第二种方式遍历集合时调用......

最佳答案

首先,您的代码错误

PersonsInversedAgeIterator iterator = persons.begin();

persons.begin() 的返回类型是std::set<Person, AgeSorter>::iterator , 以及 PersonsInversedAgeIterator 的类型是std::set<Person, AgeInversedSorter>::iterator .

第二,AgeInversedSorter是 STL 的默认顺序(std::less)..你的AgeSorter是 STL ( std::greater<>) 的相反顺序。

所以,你应该编辑Sorter s 进入您的预期顺序,并使用带有适当迭代器的适当容器。

关于c++ - 使用不同于默认排序类 STL 集的迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25201947/

相关文章:

c++ - POSIX部分写入,线程安全性和锁定

c++ - 如何使用正则表达式从字符串中提取三元组值

c++ - 如何为 STL 排序编写带有中间变量的比较器

c++ - 如何正确声明这个 vector ?

c++ - std::transform 如何不返回(而不是抛出),只是跳过?

algorithm - 最大覆盖率变体的启发式

c++ - 无法编译包含 "if constexpr"的函数模板实例化

c++ - 如何将 std::hash 专门化为来自其他库的类型

java - java链接集实现

c++ - 使用 MinGW gcc 4.4.0 boost thread_interrupted 异常终止(),3.4.5 OK