gpt4 book ai didi

c++ - 制作迭代器的拷贝是个坏主意吗?

转载 作者:太空狗 更新时间:2023-10-29 20:51:26 24 4
gpt4 key购买 nike

我正在考虑编写一些代码,归结为这一点。 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 循环,还是可以任意使用它们?for 循环中是否保留了任何状态,或者状态是否全部在迭代器中?现在,我知道没有什么比“状态存储在 for 循环中”更重要的了,据我所知,迭代器包含它需要的所有状态是最重要的。因此,如果实际上迭代器不仅包含它需要的所有状态,而且还是 100% 安全可复制的,那么我最初问题的答案是“不,这不是一个坏主意”。但潜在的可能性是迭代器可能无法 100% 安全地复制——例如,如果在复制迭代器时出现细微的别名问题,递增原始迭代器,然后尝试使用拷贝——这就是为什么这段代码感觉如此-对我来说有点粗略。

最佳答案

这取决于迭代器的类型,但它适用于 std::map::iterator

迭代器分为不同的类别,这取决于它们支持的操作以及它们提供的关于它们引用的值的保证。

std::map::iterator 满足 BidirectionalIterator 的要求概念。这意味着,除其他事项外,递增迭代器的拷贝不会使原始拷贝无效。这意味着做 prev = it;++it 不会使 prev 无效,因此您的算法定义明确。

然而,并非所有迭代器都是这种情况。 InputIterator概念不提供这种保证。注意 ++i 的后置条件:

Postcondition: Any copies of the previous value of i are no longer required to be either dereferenceable or to be in the domain of ==.

我不知道标准库中的任何迭代器会在您递增它们的拷贝时失去它们的值(value),但我个人已经构建了这样一个迭代器类型(它迭代存档文件中的条目,并且当您前进到下一个条目时,上一个条目将不再可读。

另见 Iterator , ForwardIterator , RandomAccessIterator , 和 OutputIterator概念。它们相互依存。

关于c++ - 制作迭代器的拷贝是个坏主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50159571/

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