我正在使用数组实现一个向量数据结构。自然,向量类对数据数组、其容量和大小有私有变量。
我想要一个迭代器作为内部类。迭代器被实现为一个简单的int。运算符必须检查它是否已到达数组的末尾。它是怎么做到的?如果数据结构是一个链表,那么只需检查指向下一个节点的指针==NULL。
我想到了两种解决方案,列表中的sentinel对象或指向数组大小的指针,作为迭代器内部类的私有变量。这两种解决方案似乎都不令人满意。我的问题是这通常是如何做到的?
class Vector
{
public
...
private:
int size;
int capacity;
<T> array[];
class iterator
{
public
bool isLast()
private:
int position
}
}
迭代器构造函数将向量大小作为其参数,并对照它检查其当前位置。
你的代码样本不是有效的C。如果这不是练习,请考虑使用STD::向量
我的问题是这通常是如何做到的?
通常的做法与你的做法完全不同。
在C标准向量类中,这通常是通过一个简单的指针来完成的。通过将它与向量的末端迭代器进行比较来检查它是否在末端,后者也包含(或是)一个指针。如果没有另一个迭代器来比较自身,迭代器将无法检查其位置。
if (it == v.end())
如果迭代器不仅仅是指针的typedef,迭代器的重载比较运算符只会将操作转发到底层指针,除非它包含某种用于调试的代码。比较不同向量的迭代器会导致未定义的行为。
如果你想要一个迭代器,可以在没有其他迭代器帮助的情况下验证自己的位置,那么你的问题不应该是它通常是如何完成的,因为它通常是如何完成的,不允许这个特性。一个选择是存储一个指向拥有向量的指针,以及整数位置。然后你可以检查它是否在最后:
if (position == vector_ptr->size())
最受欢迎的C迭代器失效规则帖子声称,不清楚过去的结束迭代器(即,、、、和)是否根据与普通迭代器相同的规则失效,这些迭代器指向容器中的元素。这些针对2003年和2011年C版的声明都遵从了一篇讨论结束迭代器失效规则的帖子,其中公认的答案表明2003年的标准在这个问题上是模糊的。这一结论基于23.1/10(在的上下文中)中的一条评论,该评论似乎暗示,当规范没有明确提到结束迭代器失效时,它们可能会失效。
假设我有std::vector和两个线程。 第一个线程正在处理擦除函数,而第二个线程在for循环中 这种情况是线程安全的吗? 第二个线程会继续运行还是抛出异常?
本文向大家介绍总结javascript中的六种迭代器,包括了总结javascript中的六种迭代器的使用技巧和注意事项,需要的朋友参考一下 1.forEach迭代器 forEach方法接收一个函数作为参数,对数组中每个元素使用这个函数,只调用这个函数,数组本身没有任何变化 在浏览器中输出的结果是: 2.every迭代器 every方法接受一个返回值为布尔类型的函数,对数组中的每个元素使用这个函数,
迭代器 乍看来,迭代器似乎很直观。但凑近了看,你会发现标准STL容器提供了四种不同的迭代器:iterator、const_iterator、reverse_iterator和const_reverse_iterator。很快你会注意到在这四种类型中,容器的insert和erase的某些形式只接受其中一种。那是问题的开始。为什么有四种迭代器?它们之间的关系是什么?它们可以互相转化吗?在调用算法和ST
For freedom Christ has set us free. Stand firm, therefore, and do not submit again to a yoke of slavery. 基督释放了我们,叫我们得以自由,所以要站立得稳,不要再被奴仆的轭挟制。(GALATIANS 5:1) 迭代器 迭代,对于读者已经不陌生了,曾有专门一节来讲述,如果印象不深,请复习《迭代》。
在Rust中,迭代器共分为三个部分:迭代器、适配器、消费者。 其中,迭代器本身提供了一个惰性的序列,适配器对这个序列进行诸如筛选、拼接、转换查找等操作,消费者则在前两者的基础上生成最后的数值集合。 但是,孤立的看这三者其实是没有意义的,因此,本章将在一个大节里联系写出三者。 迭代器、适配器、消费者