为什么我在使用矢量的 push_back() 函数后元素消失了



我正在尝试在类中使用std::vector来实现多路树。

每次我想在成员中添加子级时,我都会使用函数addMember。我正在使用VS2017来调试这个程序。在这个函数作用域中,父向量实际上已经通过push_back()添加了元素,但是退出函数后,向量的地址会改变,我添加的元素会消失。

这是我的代码:

#include <iostream>
#include<string>
#include<vector>
using namespace std;
class member {
public:
string name;
member* parent;
vector<member*> children;
member(string m_name,member* m_parent):name(m_name),parent(m_parent){}
};
class familyTree {
private:
member ancestor;
public:
member* getAncestor() { return &ancestor; }
familyTree(member& m_ancestor):ancestor(m_ancestor){}
member* searchMember(string name,member* node,bool& flag);
void addMember(string name, int children_number,vector<string>& children_name);
};
member* familyTree::searchMember(string name, member* node,bool& flag) {
member* find = NULL;
if (node) {
if (node->name == name)
find = node;
else {
if (!flag) {
for (auto iter = node->children.begin(); iter != node->children.end(); iter++) {
find = searchMember(name, *iter, flag);
if (flag)
break;
}
}
}
}
return find;
}
void familyTree::addMember(string name,int children_number,vector<string>& children_name) {
bool flag = false;
member* parent = searchMember(name, getAncestor(), flag);
for (auto i : children_name) {
member* child = new member(i,parent);
parent->children.push_back(child);
}
}

我怀疑familyTree::searchMember函数有问题。这是您发布的内容:

member* familyTree::searchMember(string name, member* node, bool& flag) {
member* find = NULL;
if (node) {
if (node->name == name)
find = node;
else {
if (!flag) {
for (auto iter = node->children.begin(); iter != node->children.end(); iter++) {
find = searchMember(name, *iter, flag);
if (flag)
break;
}
}
}
}
return find;
}

请注意,找到正确的节点后,没有方法可以设置flag = true

第 2if语句应为:

if (node->name == name) {
find = node;
flag = true;
}

否则在您的for循环中,

for (auto iter = node->children.begin(); iter != node->children.end(); iter++) {
find = searchMember(name, *iter, flag);
if (flag)
break;
}

即使搜索成功,for循环也不会break,因此它继续,并且您搜索的下一个子项保证不匹配。

请注意,如果搜索没有匹配名称没有任何子节点的节点,则searchMember函数的结构方式会导致返回NULL,因为跳过了for循环(没有要迭代的子节点)。因此,您最终会有很多NULL指针被分配给addMember中的parent

最新更新