迭代器的继任者不一定是常规功能:如何可能
Successor of iterator is not necessarily a regular function: how is it possible?
在《编程元素》第91页中,Stepanov和McJones说,迭代器的概念需要successor
函数,但不一定是/em>常规,因为
...
i = j
并不意味着successor(i) = successor(j)
...
(请参阅在线页面)
我理解相反的successor(i) = successor(j)
并不意味着i=j
(例如,在两个零终止列表中),并且可能无法为某些输入定义successor
函数。但是我不明白i = j
如何可能导致successor(i) != successor(j)
。
他们会指的是什么情况?也许是某些迭代器会随机(如在leatory)啤酒花中吗?或某些具有隐藏状态和"跳跃"的迭代器与指向相同元素后的其他迭代器不同(从这个意义上进行比较)。
他们立即跳到需要常规successor
功能的改进(前向材料),因此我不清楚。
最初,我认为输入迭代器可以具有此属性。但是,我仍然很难看这是否构成反例:(在STL的某个实现中)。
#include <iostream>
#include <sstream>
#include <iterator>
#include <numeric>
#include <cassert>
using std::cout; using std::endl;
int main(){
std::istream_iterator<int> it1(std::cin); // wait for one input
std::istream_iterator<int> it2 = it1;
assert(it1 == it2);
cout << "*it1 = " << *it1 << endl;
cout << "*it2 = " << *it2 << endl;
cout << "now sucessor" << endl;
++it1; // wait for one input
++it2; // wait for another input
assert(it1 == it2); // inputs still compare equal !
cout << "*it1 = " << *it1 << endl;
cout << "*it2 = " << *it2 << endl;
assert(it1 == it2); // also here ! and yet they point to different values...
assert(*it1 == *it2); // assert fails!
}
(用GCC 6.1编译)
考虑定义为:
的类型iter
struct iter { unsigned value; };
inline bool operator==(iter const& x, iter const& y) {
return x.value == y.value;
}
inline bool operator!=(iter const& x, iter const& y) {
return !(x == y);
}
auto source(iter const& x) {
return x.value;
}
iter successor(iter const&) {
std::random_device engine{};
std::uniform_int_distribution<unsigned> dist{};
return {dist(engine)};
}
iirc,iter
满足EOP Iterator
概念的要求:它是Regular
,source
是常规功能,successor
尤其是 not> not> not 常规。给定两个类型iter
的对象i
和j
,因此i == j
很可能successor(i) != successor(j)
。
一个示例可以是连续函数,它消耗了数据流(如他们在书中提到的那样)。
读取 i-th 元素后,理论上只能为其调用连续功能函数一次。如果您尝试调用两次,结果是不同的。
只需想象successor(i)
从流中读取下一个元素,即 i-th 1 元素。它实际上意味着消耗它,并且不再可用。如果您再次致电successor(i)
,您将从流中获取 i-th 2 元素。
因此,如果输入相同(i = j
),则无法保证输出相同(successor(i) = successor(j)
)。
- 有没有可能有一个只有ADL才能找到的非好友功能
- 链表删除功能的单指针 // 是可能的
- 具有sleep_for和sleep_until功能的 gcc 可能存在的问题
- 如何强调功能可能抛出?
- 覆盖私有功能,它与受保护功能有何不同?
- C++ Mac Xcode 错误:控制可能达到非无效功能的末尾
- 是否有可能通过演绎指南实现整个 std::make_tuple 功能?
- 线程功能之一不执行可能的比赛条件
- 虚拟功能是否不太可能导致堆栈溢出
- 警告:'dymmy' 在此功能中可能未初始化使用
- 功能和变量从何而来
- 功能是否有可能使用其参数返回指针
- “并非所有控制路径都返回一个值./&quot“控制可能达到非空隙功能的末端”.验证时循环时
- 警告:控制可能达到非无效功能的终点?返课时
- 函数应该返回可能会失败的功能
- 是否有可能覆盖全局实现的功能
- 处理 com 版本中可能存在的不存在的功能
- 迭代器的继任者不一定是常规功能:如何可能
- 分割故障,可能的原因:功能指针,多线程,STL地图等
- 有谁知道免注册COM和拖放功能之间可能存在哪种关系