我正在学习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中的任何其他容器。
答案 0 :(得分:2)
有三个选项可以仅使用向量而不使用其他容器来解决此问题:
1)避免重新分配。只有当您知道要在向量中插入的预期元素数量的最大值M时,才能实现此目的。在这种情况下,您可以students.reserve(M);
。
2)忘记sortedByID
和sortedByName
的指针。使用整数(或更好地说size_t
)将学生的索引存储在students
而不是指针中。当然,这假设学生的项目顺序永远不会改变。
3)不要将学生自己存储在向量中,而是将students
作为指向免费商店分配的学生(未分类)的指针向量。如果此替代方案符合您的所有标准,我建议先行shared_ptr<Student>
而不是原始指针。