使用列表时我遇到了一些问题.
我所拥有的:我正在从聊天框中读取新的文本行.我总是从框中取出最后20行,然后我想将它们与之前提取的所有行进行比较.如果发现新行,则将其发送到外部函数,该函数反汇编该行以进行进一步处理.在我使用数组和向量之前,列表似乎是更好的方法.
我的想法:我有一个名为usedlines的列表,其中包含所有旧的已经使用过的行.fetchedLines列表包含从聊天框中获取的最新20行.
不,我只想循环使用它们来查明所获取的行是否包含之前未见过的新行.在循环之后,fetchedlines中的遗留被处理到下一个函数.
问题:当我循环通过这个循环时,我会在一段时间后得到一个错误的指针.为什么?额外奖励:有没有人有更好的想法来解决这个任务?
typedef list<string> LISTSTR;
LISTSTR::iterator f;
LISTSTR::iterator u;
LISTSTR fetchedlines;
LISTSTR usedLines;
fetchedlines.insert(fetchedlines.end(), "one");
fetchedlines.push_back("two");
fetchedlines.push_back("three");
fetchedlines.push_back("four");
fetchedlines.push_back("three");
usedLines.push_back("three");
usedLines.push_back("blää");
usedLines.push_back("lumpi");
usedLines.push_back("four");
for (u = usedLines.begin(); u != usedLines.end(); u++)
{
for (f = fetchedlines.begin(); f != fetchedlines.end(); f++)
{
if(*u==*f)
fetchedlines.remove(*f);
}
}
Run Code Online (Sandbox Code Playgroud)
调用fetchedlines.remove(*f)使您的迭代器无效.
编辑:
您遇到的问题的一个可能的解决方案是反而只是迭代usedLines并删除fetchedlines包含的所有元素.
for (u = usedLines.begin() u != usedLines.end(); u++)
fetchedLines.remove(*u);
//Process all of fetchedLines
Run Code Online (Sandbox Code Playgroud)
在迭代列表(或几乎任何其他容器)时,绝对不能修改它。这是你眼前的问题。
一个更有趣的问题是为什么你首先要这样做。有没有办法获得线路上的连续数字,或者时间戳,以便您可以比较它们?