如何保持指向存储在vector中的结构的指针有效?

时间:2016-03-30 20:45:13

标签: c++ pointers vector structure realloc

我正在学习C ++,而且我对指向存储在vector中的结构的指针有困难。问题是我需要保持结构Student排序两次。根据学生的身份和学生姓名的另一次,所以很容易搜索其中的值。因此,我创建了两个指针向量:

vector<Student *> sortedByID;    
vector<Student *> sortedByName;

结构看起来像这样,我也把它保存在矢量中(即使它可能不是一个好主意):

struct Student {
    int id;
    string name;
};

vector <Student> students;

我用push_back创建新结构并用函数填充参数(是的,我有一个构造函数)。为了保持指针向量的排序,我使用lower_bound,如下所示:

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

问题在于,每次我使用push_back添加结构时,它会重新分配新的向量并销毁先前对象的地址,因此vector sortedByID中的指针指向无效值。我认为它与结构数组是一样的,因为一旦数组已满,没有其他方法(据我所知)调整大小,而不是创建一个新数组并复制前一个数据的所有数据(所以地址会再次改变)。

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

1 个答案:

答案 0 :(得分:2)

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

1)避免重新分配。只有当您知道要在向量中插入的预期元素数量的最大值M时,才能实现此目的。在这种情况下,您可以students.reserve(M);

2)忘记sortedByIDsortedByName的指针。使用整数(或更好地说size_t)将学生的索引存储在students而不是指针中。当然,这假设学生的项目顺序永远不会改变。

3)不要将学生自己存储在向量中,而是将students作为指向免费商店分配的学生(未分类)的指针向量。如果此替代方案符合您的所有标准,我建议先行shared_ptr<Student>而不是原始指针。