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;