C++ 对数组排序会导致指针链接错误
所以我在做一个有一些整数和指针的对象排序算法。每当我进行排序时,指针就开始表现出奇怪的行为,并链接到错误的索引 这是我的密码C++ 对数组排序会导致指针链接错误,c++,pointers,shallow-copy,C++,Pointers,Shallow Copy,所以我在做一个有一些整数和指针的对象排序算法。每当我进行排序时,指针就开始表现出奇怪的行为,并链接到错误的索引 这是我的密码 #include<iostream> #include<stdio.h> using namespace std; class person { public: int knots, time, ID; int untie, status = 1; person *next = NULL; }; ///DEBUG void
#include<iostream>
#include<stdio.h>
using namespace std;
class person
{
public:
int knots, time, ID;
int untie, status = 1;
person *next = NULL;
};
///DEBUG
void print(person *a, int p)
{
for (int i = 0; i < p; i++)
{
cout<<a[i].ID<<": "<<a[i].knots<<" "<<a[i].time<<" "<<a[i].untie<<" "<<a[i].status<<" Next: "<<a[i].next->ID<<endl;
}
cout<<endl;
}
int main()
{
int p;
scanf("%d\n", &p);
while (p != -1)
{
person *people = new person[p];
for (int i = 0; i < p; i++)
{
people[i].ID = i+1;
scanf("%d ", &people[i].knots);
if (i)
{
people[i-1].next = &people[i];
}
}
people[p-1].next = &people[0];
scanf("/n");
for (int i = 0; i < p; i++)
{
scanf("%d ", &people[i].time);
if (i)
{
people[i-1].untie = people[i-1].time * people[i].knots;
}
}
people[p-1].untie = people[p-1].time * people[0].knots;
print(people, p);
///SORTING
for (int i = 0; i < p-1; i++)
{
for (int j = i; j < p; j++)
{
if (people[j].untie < people[i].untie)
{
person x = people[j];
people[j] = people[i];
people[i] = x;
}
}
}
print(people, p);
for (int i = 0; i < p; i++)
{
if (people[i].status)
{
if (people[i].next->untie == people[i].untie)
{
people[i].next->status = 2;
}
else
people[i].next->status = 0;
if (people[i].status == 2)
people[i].status = 0;
}
}
print(people, p);
}
}
#包括
#包括
使用名称空间std;
班主任
{
公众:
整数节,时间,ID;
int unte,status=1;
person*next=NULL;
};
///调试
无效打印(个人*a,整数p)
{
对于(int i=0;istruct
中记录的地址person*next
没有更改
因此,旧地址仍在
结构人
中,而该地址中的内容在交换过程中已被修改,这导致了不一致性。此代码非常复杂。我会将其扔掉,从头开始重新思考。您确实应该避免使用命名空间std-这是一个坏习惯当你不期望的时候,你就可以进入。习惯于使用名称空间前缀(std
故意很短),或者只将你需要的名称导入到最小的合理范围内。还有,为什么在21世纪,当你有一个非常好的std::sort()
可用时,你还要编写冒泡排序呢?(显然,这不会解决移动指向对象的问题,但会使代码更加清晰易读。)你建议做什么编辑?@thiny让向量
存储指针,而不是对象本身。我的问题是否与浅层复制有关?@thiny你似乎试图将数组的行为与链表结合起来。你需要下一个指针做什么?@thiny你可以像Lilistune建议的那样完全使用指针,y您可以在对数组进行排序之前复制数组,您可以存储原始数组索引,而不是下一个指针。每个指针都有优点和缺点。All-in-on指针的空间局部性较差,导致缓存未命中的可能性大大增加(降低运行时性能),此外,它还带来了额外的内存管理问题。复制需要时间,并使内存成本加倍。从存储的索引重新创建原始顺序可能会很昂贵(但通常不会像缓存未命中那样昂贵)
person x = people[j];
people[j] = people[i];
people[i] = x;