gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:16:58 27 4
gpt4 key购买 nike

我正在学习 C++,但在处理指向 vector 中存储的结构的指针时遇到了麻烦。问题是我需要保持结构 Student 排序两次。一次通过学生的 id,另一次通过学生的名字,所以很容易搜索其中的值。因此,我创建了两个指针 vector :

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

结构看起来像这样,我也将它保存在 vector 中(尽管这可能不是一个好主意):

struct Student {
int id;
string name;
};

vector <Student> students;

我正在使用 push_back 创建新结构并用函数中的参数填充它(是的,我有一个构造函数)。为了保持指针 vector 排序,我使用 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 并破坏先前对象的地址,因此 vector sortedByID 中的指针指向无效值。我认为它与结构数组相同,因为一旦数组已满,就没有其他方法(据我所知)调整它的大小,而不是创建一个新数组并复制前一个数组的所有数据(因此地址将再次更改)。

有什么巧妙的方法可以解决这个问题吗?请注意,我只被允许使用 vector 而不是来自 STL 的任何其他容器。

最佳答案

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

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

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

3) 不要将学生自己存储在一个 vector 中,而是制作students从空闲存储区分配的指向学生(未排序)的指针 vector 。如果此替代方案符合您的所有标准,我建议您继续 shared_ptr<Student> 而不是原始指针。

关于c++ - 如何保持指向存储在 vector 中的结构的指针有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36319352/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com