首先,我快速回顾了 c++ 风格的迭代器。例如:
//--- Iterating over vector with iterator.
vector<int> v;
. . .
for (vector<int>::iterator it = v.begin(); it!=v.end(); ++it) {
cout << *it << endl;
}
它是灵活的。更改底层容器类型很容易。例如,您可能稍后决定插入和删除的数量如此之多,以至于列表比向量更有效。它还有许多有用的成员函数。向量的许多成员函数都使用迭代器,例如,赋值、插入或擦除。此外,我们可以双向使用迭代器(如果支持),例如 ++、--。这对于解析类似对象的流很有用。
python的问题是: 1:目前python for循环语法不如c++ for灵活。(好吧,更安全) 2:而不是“it!= iter.end()”样式,python 将在 next() 没有更多内容时抛出异常。它不灵活。
问题1:我上面的想法正确吗?
好的。我的问题来了,如何实现一个和c++迭代器一样强大的python迭代器?目前,python for 循环语法不如 c++ for 灵活。我还找到了一些可能的解决方案,例如http://www.velocityreviews.com/forums/t684406-pushback-iterator.html。但它要求用户 push_back 一个东西,而不是问迭代器——。
问题2:在python中实现双向迭代器最好的是什么?就像http://www.cplusplus.com/reference/std/iterator/BidirectionalIterator/一样。伪代码如下:
it = v.begin();
while( it!=v.end()) {
//do sth here
if (condition1)
++it;//suppose this iterator supports ++
if(condition2)
--it;//suppose this iterator supports --
}
主要特点是:1)双向,2)更简单的“结束”检查。“++”或“--”运算符或常用函数无关紧要(无论如何它没有语义差异)。
谢谢,
更新:我从答案中得到了一些可能的解决方案:
i = 0
while i < len(sequence): # or i < len and some_other_condition
star_it = sequence[i]
if condition_one(star_it):
i += 1
if condition_two(star_it):
i = max(i - 1, 0)
但是,与数组不同,列表的随机访问应该是 O(n)。我想python内部的“列表”对象是使用链表之类的东西实现的。因此,这种 while 循环解决方案效率不高。但是,在 C++ 中,我们有“随机迭代器”、“双向迭代器”。我应该如何获得更好的解决方案?谢谢。