如何使指向存储在vector中的结构的指针保持有效? 我正在学习C++,而且我对指针存储在向量中的结构有困难。问题是我需要将结构学生排序两次。一次按学生id,另一次按学生姓名,因此很容易搜索其中的值。因此,我创建了两个指针向量: vector<Student *> sortedByID; vector<Student *> sortedByName;

如何使指向存储在vector中的结构的指针保持有效? 我正在学习C++,而且我对指针存储在向量中的结构有困难。问题是我需要将结构学生排序两次。一次按学生id,另一次按学生姓名,因此很容易搜索其中的值。因此,我创建了两个指针向量: vector<Student *> sortedByID; vector<Student *> sortedByName;,c++,pointers,vector,structure,realloc,C++,Pointers,Vector,Structure,Realloc,问题是,每次我添加带有push_back的结构时,它都会重新定位新的向量并破坏以前对象的地址,因此向量sortedByID中的指针指向无效值。我认为对于结构数组也是一样的,因为一旦数组满了,就没有其他方法(据我所知)来调整它的大小,只能创建一个新数组并复制上一个数组中的所有数据(因此地址将再次更改) 有什么聪明的办法解决这个问题吗?请注意,我只允许使用vector,而不允许使用STL中的任何其他容器。有三个选项可以解决此问题,仅使用vector而不使用其他容器: 1) 避免重新分配。只有知道要插

问题是,每次我添加带有push_back的结构时,它都会重新定位新的向量并破坏以前对象的地址,因此向量sortedByID中的指针指向无效值。我认为对于结构数组也是一样的,因为一旦数组满了,就没有其他方法(据我所知)来调整它的大小,只能创建一个新数组并复制上一个数组中的所有数据(因此地址将再次更改)


有什么聪明的办法解决这个问题吗?请注意,我只允许使用vector,而不允许使用STL中的任何其他容器。

有三个选项可以解决此问题,仅使用vector而不使用其他容器:

1) 避免重新分配。只有知道要插入到向量中的预期元素数的最大M,才能实现这一点。在这种情况下,你可以

2) 忘记
sortedByID
sortedByName
的指针。使用整数(或者更好地说是
size\t
)在
students
中存储学生的索引,而不是指针。当然,这假设学生中项目的顺序从未改变


3) 不要将学生本身存储在向量中,而是将
students
作为指向学生(未排序)的指针向量,这些指针是从空闲存储中分配的。如果这个选择符合你的所有标准,我建议你走在前面,而不是原始的指针

在这种情况下,你不能选择指数。即使向量重新分配了它的内部数组,它们也不会改变。您可以将排序后的向量设置为索引到
学生中的整数向量。当然,你必须确保在不重新计算排序的情况下,不要从
学生中间删除。你只允许使用
向量
,是吗?看起来不像是现实世界的问题,是吗rolleyes:请包含足够的代码来构成一个数组,这还取决于实际操作
向量
数组的频率。如果只填充一次,并且您事先知道向量或数组的大小,那么内存地址不会改变位置1)我不知道结构中元素的最终数量,但它们有数千个。2) 我可能会这样做,但不能保证某些学生不会被删除(我要说的是,可以保证他们会被删除)。所以我需要找到一种方法来再次检查和排序结构。这背后的想法是保持它的排序,这样就可以实现二进制搜索。我需要相对快速地处理结构中的值(max O(logn))。如果您将数据结构封装在一个类中,您可以很好地控制删除,并设想以不同于顺序的顺序插入学生。使用索引可以非常方便地实现,因为在排序向量中,您可以轻松找到要删除的索引和要调整的索引。
struct Student {
    int id;
    string name;
};

vector <Student> students;
students.push_back(Student(id, name));
it = lower_bound(sortedByID.begin(), sortedByID.end(), id, cmp());
sortedByID.insert(it, &(students.back()));
//the same for name