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