gpt4 book ai didi

c++ - 什么影响了我的指针集的排序(具体示例)

转载 作者:行者123 更新时间:2023-11-30 05:39:37 24 4
gpt4 key购买 nike

在下面的测试代码中,指针显然是按集合中的地址排序的,如打印输出所示。什么可以改变集合中的顺序,使得 id 不按顺序打印,而不改变插入对象的顺序?

有人可以通过更改此代码来展示示例吗?

#include <iostream>
#include <set>

class Object {
int id;
public:
void setId (int i) {id = i;}
int getId() {return id;}
};

int main ()
{
std::set<Object*> myset1;
std::set<Object*> myset2;
std::set<Object*>::iterator it;
Object *obj;

for (int i=1; i<=5; ++i){
obj = new Object();
obj->setId(i);
myset1.insert(obj);
}

for (int i=1; i<=5; ++i){
obj = new Object();
obj->setId(i);
myset2.insert(obj);
}

std::cout << "myset1 contains:";
for (it=myset1.begin(); it!=myset1.end(); ++it)
std::cout << ' ' << (*it)->getId() << "(" << (long long)*it << ")";
std::cout << '\n';

std::cout << "myset2 contains:";
for (it=myset2.begin(); it!=myset2.end(); ++it)
std::cout << ' ' << (*it)->getId() << "(" << (long long)*it << ")";
std::cout << '\n';

return 0;
}

输出:

myset1 contains: 1(24842256) 2(24842336) 3(24842416) 4(24842496) 5(24842576)
myset2 contains: 1(24842656) 2(24842736) 3(24842816) 4(24842896) 5(24842976)

最佳答案

您的问题有些含糊不清,因为您不清楚您是否寻求针对未说明问题的比较器更改解决方案,或者只是想知道是否有可能使用相同的比较器和相同的插入顺序 生成您看到的顺序。大多数其他答案似乎都在磨练前者;这个将解决后者。

std::set<>容器利用 std::less<>默认为其比较器。对于任何指针类型,std::less<>提供基于总内存排序的专门化(如您所见)。

你完全被内存分配器摆布了。例如,考虑将以下代码更改为您的第一个循环:

char *tmp = new char[sizeof(Object)];

for (int i=1; i<=5; ++i){
obj = new Object();
obj->setId(i);
myset1.insert(obj);
if (i == 3)
delete [] tmp; // open the hole up after the third insertion
}

在我的设备 (OS X 10.10.5) 上,这给出了以下输出:

myset1 contains: 4(4296037184) 1(4296037200) 2(4296037264) 3(4296037328) 5(4296037440)
myset2 contains: 1(4296037504) 2(4296037568) 3(4296037632) 4(4296037696) 5(4296037760)

我可以推测是什么原因造成的。最初的临时分配一旦被释放,就会为堆管理器的空闲链添加一个空闲 block ,这(并非巧合)是循环中下一次分配(第 4 次)消耗的完美大小。

不知道这是否是您要查找的内容,但归根结底,您的代码确实完全受内存管理器的支配,它决定了对象占用的地址,并因此决定了它们在集合中的顺序.

关于c++ - 什么影响了我的指针集的排序(具体示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32275227/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com