C++ 是否允许标准迭代器操作抛出?

C++ 是否允许标准迭代器操作抛出?,c++,C++,考虑一个标准迭代器,其中需要为遍历数据结构分配内存。如果无法分配内存,标准是否允许迭代器引发异常?作为一个示例,请考虑树数据结构的输入迭代器。在这种情况下,要遍历树,您必须添加并维护一个指向每个节点父节点的指针(这将降低不需要此类指针的操作的速度,如在树上插入/擦除/查找),或者使用堆栈帮助迭代器存储指向遍历节点的指针。在这种情况下,当堆栈前进时,可以增长到没有更多的空闲内存,迭代器被迫抛出。 < P>是的,C++中允许迭代器的方法抛出,正如您指出的,可以抛出某些情况。p> C++中唯一不能抛

考虑一个标准迭代器,其中需要为遍历数据结构分配内存。如果无法分配内存,标准是否允许迭代器引发异常?作为一个示例,请考虑树数据结构的输入迭代器。在这种情况下,要遍历树,您必须添加并维护一个指向每个节点父节点的指针(这将降低不需要此类指针的操作的速度,如在树上插入/擦除/查找),或者使用堆栈帮助迭代器存储指向遍历节点的指针。在这种情况下,当堆栈前进时,可以增长到没有更多的空闲内存,迭代器被迫抛出。

< P>是的,C++中允许迭代器的方法抛出,正如您指出的,可以抛出某些情况。p>

C++中唯一不能抛出的函数是析构函数。实际上,这只是惯例(因为它使得某些操作几乎不可能正确执行)。析构函数可以抛出,让它们这样做是非常糟糕的


单个函数可以标记为
throw()
,以防止它们抛出

“在这种情况下,要遍历树,您必须添加并维护一个指向每个节点父节点的指针”每个节点都应该有一个指向其父节点的指针。否则这是一棵“向前”的树,你只能往下走。我要说的是,使用堆栈的迭代器在依赖全局或共享对象(从而使其成为非线程安全对象)和仅为遍历树分配内存时都会被破坏。注意,C++11中
std::forward_list
的迭代器是正向迭代器;你根本不能回去。@Nicol谁说堆栈是全局的还是共享的?堆栈与迭代器实例相关联。此外,堆栈可能是在树上实现输入迭代器的唯一方法,其中节点只有指向其后续节点的指针。输入迭代器不会将元素插入到数据结构中。它们只能读取和修改已经存在的元素。输出迭代器可以,但您会注意到,其中大多数是容器的迭代器适配器,而不是迭代器。树节点应该指向它们的父节点。@Nicol。我从来没有提到过插入器。我已经谈到了输入迭代器。关于这些迭代器,我的问题中涉及的唯一方法是用于推进的运算符++()。要在节点没有指向其父节点的指针的树中前进,必须使用堆栈。我看不到其他的方法。我还说,在每个节点中使用父指针会减慢树上的插入/删除/查找等方法,因为这样的指针对于这些方法的实现是不必要的,尽管它们可能有助于实现安全输入迭代器。“C++中唯一不能抛出的函数是析构函数”。该标准定义了许多不允许抛出的标准库函数。例如,
auto_ptr
的大多数构造函数在C++03中被指定为
throw()
,这意味着它们不能抛出。在C++11中,几乎每一个
swap
实现都是用
noexcept
@nicolabolas定义的,我更想做一个关于是否允许抛出一个类/类型的函数的一般性声明。
throw()
修饰符当然表示单个函数不能抛出。不过,我会加上一条说明。我不熟悉
noexcept
,你有一个很好的参考页吗。@JaredPar:这是C++11中引入的新语法。哪种VisualC++已经被忽略了,尽管它应该是最容易实现的一个(几乎与代码>参见C++11标准的第15.4节和第5.3.7节。