指针集中元素的顺序
Order of elements in set of pointers
为什么即使我已经注释了A::operator<
,也会编译以下代码。我想知道在没有<
运算符的情况下如何按升序打印以下代码的输出。如何将顺序更改为降序?(注意:如果我使用A
而不是A*
,除非我提供A::operator<
的定义,否则不会编译此代码)
#include <iostream>
#include <set>
using namespace std;
class A
{
public:
A(int v):x(v){}
virtual ~A(){}
int x;
/*bool operator<(const A &a) const
{
return x > a.x;
}*/
};
int main()
{
set<A*> numbers;
A* a1 = new A(1);
A* a2 = new A(2);
A* a3 = new A(3);
numbers.insert(a2);
numbers.insert(a3);
numbers.insert(a1);
for(set<A*>::iterator itr = numbers.begin();itr!=numbers.end();itr++)
{
cout << (*itr)->x << endl;
}
// output: 1 2 3
return 0;
}
编译代码是因为您有一组指针。由于集合包含指针,并且您的运算符不比较指针,而是比较A
类型的对象,因此集合不需要它。有一个现有的指针小于比较运算符,这是您的集合中使用的运算符。
您可以通过提供自己的比较器来实现严格的弱排序来更改顺序:
struct APtrComp
{
bool operator()(const A* lhs, const A* rhs) const { /* implement logic here */ }
};
并将其用作第二个模板参数实例化您的集合。
set<A*, APtrComp> numbers;
你有一组指针。 通常指针按递增顺序分配。 指针具有默认的<
运算符。 所以这就是它编译和工作的原因。
附言,无论值是什么,它都会按此顺序打印 A1 A2 A3 的值:
...
A* a1 = new A(9);
A* a2 = new A(5);
A* a3 = new A(1);
...
// output: 9 5 1
如果你记得你的指针算术,所有点都会被赋予一组运算符,以便在操作中使用(包括运算符<)。您的集合将使用此默认运算符 <。
据我了解,您想知道为什么即使您没有operator<
,代码也会使用A*
进行编译,以及如何将顺序从升序更改为降序。
它之所以编译,是因为它使用带有指针地址的operator<
。
将cout << (*itr)->x << endl;
更改为cout << (*itr)->x << ' ' << *itr << endl;
,您将很容易看到它:)
如果您使用的是set<A>
,则代码在没有operator<
的情况下无法编译是正常的。它不知道要比较什么才能插入排序的成员。所以你必须提供那个操作员!
如果要继续使用指针,可以使用@juanchopanza提供的代码。
相关文章:
- 为什么用户定义的函数不按照给定的顺序对相同长度的元素进行排序?
- 快速排序 - 三个中位数枢轴选择 - 某些元素顺序不正确
- 序列容器 - 只能按顺序访问元素
- 如何检查 2 个 c++ 数组在 O(1) 或 O(log n) 时间复杂度中是否相同(所有元素都相同,顺序很重要)?
- 保留从一个多集复制到另一个多集的元素的顺序
- 如何在 C++ 中将从文本文件中读取的元素推送和弹出到数组中,并按 Revserse 顺序输出堆栈?
- 查找数组的第一个和最后一个索引,其中 from 和 to 元素的顺序总和最大
- 编写一个递归功能,该功能采用数组并以相反顺序显示元素,而无需在末尾启动数组的索引
- 编写链接函数的更短/更有效的方法,该函数按字典顺序添加新元素
- stable_sort不遵守元素的顺序
- 从容器中获取随机元素,该容器在恒定时间内没有严格的元素顺序
- 如何在默认和二维数组中找到顺序扩大元素的位置
- 多重映射是否保证广告顺序与其初始值设定项中给出的元素顺序匹配
- 调用std::nth_element后第n个元素之前的元素顺序
- 控制地图中元素的顺序
- 指针集中元素的顺序
- 一种按排序顺序保持元素的数据结构,支持快速插入和计算连续元素之间的最大差异
- 双向循环列表中的赋值运算符以错误的顺序添加元素
- 更改STL多集中两个相等元素的顺序
- 初始值设定项列表中元素的求值顺序