你能告诉我为什么这段代码不能按预期工作吗? 它应该以相反的顺序打印人员,但由于某种原因它没有。
#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/