[英]How can I work around this circular dependency?
我正在制作一种索引列表。 我有一个看起来像这样的结构:
struct MyList {
list<Word> records;
map<char, list<list<Word>::iterator>> index;
void add_word(Word);
void erase_by_letter(char&);
};
每次我将 Word 添加到 MyList 时,对于它具有的每个唯一字符,我都会在其上添加一个迭代器到“索引”映射中。 这样我可以快速访问每个包含字母“a”或字母“n”等的单词。但这有一个问题:从记录中删除一个单词后,索引中指向它的每个迭代器都变得无效。 要解决这个问题,每个 Word 都会在其上存储一个引用列表,并且 ~Word() 在对象删除时清理它们。 它看起来像这样:
struct Word {
Word(string);
~Word();
vector<pair<list<list<Word>::iterator>*, list<list<Word>::iterator>::iterator>> refs;
void add_ref(pair<list<list<Word>::iterator>*, list<list<Word>::iterator>::iterator>);
void clean_refs();
string value;
};
所以。 到目前为止,所有这些都运行良好。 在我的菜鸟眼中,它看起来不是一个好的设计,但我可以接受。 问题是 GDB 不能。 我使用 VS Code + GDB,每次调试器靠近这个结构时,它都会停止响应。 我的猜测是它进入了一个无限循环,因为索引中的条目指向记录中的Word ,而Word本身具有内部refs向量,该向量指向索引条目等等,如此糟糕的调试器只能盯着深渊。
两个问题:
让我们回到最初的问题:删除单词时迭代器无效。
首先,我会删除您在 Word 结构中配置的所有参考资料,以便恢复到干净的状态。
所以现在,我们有这个:
struct Word
{
Word(string);
~Word();
string value;
};
现在,让我们继续您的 struct MyList。 正如您所解释的,问题是在删除指向它的单词后您拥有的无效迭代器。
这是我的建议:
在用于从 MyList 中删除单词的 delete 方法中,在删除相关单词之前, 1.遍历 MyList 并让迭代器指向您的 Word。
然后, 2.解析你的迭代器映射并删除与步骤1相同的迭代器。
最后, 3.从 MyList 中删除你的单词。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.