【发布时间】:2012-04-19 04:45:42
【问题描述】:
首先,我快速回顾一下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() 没有更多内容时抛出异常。不灵活。
问题一:我上面的想法对吗?
好的。我的问题来了,如何实现一个和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++ 中,我们有“随机迭代器”、“双向迭代器”。我应该如何获得更好的解决方案?谢谢。
【问题讨论】:
-
您能否举一个具体的例子说明您在
Python中无法做到但在C++中可以轻松做到的事情? -
Python
yield+ 异常机制非常灵活(这就是我们在函数式编程中所说的“延续”)。学会正确使用它们,你会得到回报。在 Python 中定义复合迭代器比在 C++ 中容易得多。 -
这个问题太含糊了,目前的形式没有真正的答案。
-
对于双向迭代,Python 的 collections.deque 可能是你想要的(其中双端队列的头部是“迭代器”并且你使用 deque.rotate() 来“移动迭代器”),但是这是一个相当罕见的用例。对于几乎所有常见情况,Python 列表的使用都比 C++ 向量简单得多。
标签: c++ python for-loop iterator