我在考虑编写一些代码,它将简化为以下内容。
我的问题是,像这样将
我不希望在此循环运行时销毁
一方面,我知道的关于迭代器的所有内容都应该是完全安全的。但另一方面,有些关于迭代器的东西我不知道,这感觉稍微有点可疑,所以我想问问。
补充说明:
另一个原因是我的实际代码不会涉及我上面写的那个 for 循环。我实际上有事件驱动的代码;它看起来更像是这样:
因此,换个方式问我的问题可能是:“你必须在传统的for循环中使用迭代器和集合类的begin()和end()方法吗?还是可以任意使用它们?for循环中是否保留了任何状态,或者所有状态都在迭代器中?”我知道没有像“存储在for循环中的状态”这样的东西,据我所知,对于迭代器来说,包含所有所需状态是至关重要的。因此,如果事实上迭代器不仅包含了所有需要的状态,而且也是100%安全可复制的,那么对于我最初的问题,答案就是“不,这不是一个坏主意”。但是,潜在的可能性是迭代器可能不是100%安全可复制的——例如,如果复制迭代器,增加原始值,然后尝试使用副本时出现了微妙的别名问题,那么这段代码对我来说就感觉有点不靠谱。
T
是一个集合类型(目前是 std::map
,如果有影响的话)。T coll;
// ...
T::iterator it, prev;
prev = coll.end();
for(it = coll.begin(); it != coll.end(); ++it) {
if(prev != coll.end())
{ do something involving previous element; }
do something involving this element;
prev = it;
}
我的问题是,像这样将
it
复制到 prev
中是否是一个不好的想法?这是一种不好的风格吗?可能会惹恼某些挑剔的人吗?取决于类型 T
的微妙细节,可能会出现问题吗?我不希望在此循环运行时销毁
coll
,也不希望添加或删除任何元素。一方面,我知道的关于迭代器的所有内容都应该是完全安全的。但另一方面,有些关于迭代器的东西我不知道,这感觉稍微有点可疑,所以我想问问。
补充说明:
另一个原因是我的实际代码不会涉及我上面写的那个 for 循环。我实际上有事件驱动的代码;它看起来更像是这样:
void onStartDoingSomething() {
it = coll.start();
prev = coll.end();
startOperation(it, prev);
timerStart();
}
void onTimer() {
if(finished with operation on it) {
prev = it;
++it;
startOperation(it, prev);
if(it == coll.end() {
timerStop();
call operation finished;
}
}
}
void startOperation(T::iterator next, T::iterator prev) {
if(prev != coll.end()) {
finish operation on prev;
}
if(next != coll.end()) {
start operation on next;
}
}
因此,换个方式问我的问题可能是:“你必须在传统的for循环中使用迭代器和集合类的begin()和end()方法吗?还是可以任意使用它们?for循环中是否保留了任何状态,或者所有状态都在迭代器中?”我知道没有像“存储在for循环中的状态”这样的东西,据我所知,对于迭代器来说,包含所有所需状态是至关重要的。因此,如果事实上迭代器不仅包含了所有需要的状态,而且也是100%安全可复制的,那么对于我最初的问题,答案就是“不,这不是一个坏主意”。但是,潜在的可能性是迭代器可能不是100%安全可复制的——例如,如果复制迭代器,增加原始值,然后尝试使用副本时出现了微妙的别名问题,那么这段代码对我来说就感觉有点不靠谱。
it = coll.begin()
。 - eerorikastd::adjacent_find
和一个谓词,该谓词在容器中每个相邻的值对上调用。只需确保谓词始终返回 false 即可。由于std::adjacent_find
基本上做了你正在做的事情,即迭代,如果它对于std::adjacent_find
足够好,那么对于你也足够好。 - Sam Varshavchikstd::map
派生?子类化/继承标准容器? - Andriy Tylychko