我读过"潜入Python 3","readlines()方法现在返回一个迭代器,因此它与Python 2中的xreadlines()一样高效".见这里:http://diveintopython3.org/porting-code-to-python-3-with-2to3.html.我不确定这是真的,因为他们在这里没有提到它:http://docs.python.org/release/3.0.1/whatsnew/3.0.html.我该怎么检查?
我离开了一会儿,试图把老瓜弄脏之后回到c ++.
在Java中,Iterator是具有方法的容器的接口:hasNext(),next()和remove().hasNext()的存在意味着它具有对遍历容器的限制的概念.
//with an Iterator
Iterator<String> iter = trees.iterator();
while (iter.hasNext())
{
System.out.println(iter.next());
}
Run Code Online (Sandbox Code Playgroud)
在C++标准模板库中,迭代器似乎表示支持operator ++和operator ==的数据类型或类,但没有内置限制的概念,因此在前进到下一个项目之前需要进行比较.用户必须检查限制,比较正常情况下的两个迭代器,第二个迭代器是容器端.
vector<int> vec;
vector<int>::iterator iter;
// Add some elements to vector
v.push_back(1);
v.push_back(4);
v.push_back(8);
for(iter= v.begin(); iter != v.end(); iter++)
{
cout << *i << " "; //Should output 1 4 8
}
Run Code Online (Sandbox Code Playgroud)
这里有趣的部分是在C++中,指针是数组的迭代器.STL采用了现有的并围绕它构建惯例.
有什么进一步的细微之处,我失踪了吗?
我想自己弄明白,但我想知道将带有yield语句的函数转换为枚举器状态机的算法是什么?例如,C#如何转变:
IEnumerator<string> strings(IEnumerable<string> args)
{ IEnumerator<string> enumerator2 = getAnotherEnumerator();
foreach(var arg in arg)
{ enumerator2.MoveNext();
yield return arg+enumerator.Current;
}
}
Run Code Online (Sandbox Code Playgroud)
进入这个:
bool MoveNext()
{ switch (this.state)
{
case 0:
this.state = -1;
this.enumerator2 = getAnotherEnumerator();
this.argsEnumerator = this.args.GetEnumerator();
this.state = 1;
while (this.argsEnumerator.MoveNext())
{
this.arg = this.argsEnumerator.Current;
this.enumerator2.MoveNext();
this.current = this.arg + this.enumerator2.Current;
this.state = 2;
return true;
state1:
this.state = 1;
}
this.state = -1;
if (this.argsEnumerator != null) this.argsEnumerator.Dispose();
break;
case 2:
goto state1;
}
return …Run Code Online (Sandbox Code Playgroud) 我知道find方法在std :: map中找到提供的键,并将迭代器返回给元素.反正有没有找到值并获得元素的迭代器?我需要做的是检查std :: map中是否存在指定的值.我通过循环地图中的所有项目并进行比较来完成此操作.但我想知道有没有更好的办法.
这是我写的
bool ContainsValue(Type_ value)
{
bool found = false;
Map_::iterator it = internalMap.begin(); // internalMap is std::map
while(it != internalMap.end())
{
found = (it->second == value);
if(found)
break;
++it;
}
return found;
}
Run Code Online (Sandbox Code Playgroud)
编辑
如何在内部使用另一个存储值,键组合的地图.所以我可以打电话找到它吗?std :: map中的find()是否进行顺序搜索?
谢谢
我有一个实现Iterator的类,ResultSet作为数据成员.基本上这个类看起来像这样:
public class A implements Iterator{
private ResultSet entities;
...
public Object next(){
entities.next();
return new Entity(entities.getString...etc....)
}
public boolean hasNext(){
//what to do?
}
...
}
Run Code Online (Sandbox Code Playgroud)
如何检查ResultSet是否有另一行,以便我可以创建一个有效的hasNext方法,因为ResultSet没有自己定义hasNext?我正在考虑进行SELECT COUNT(*) FROM...查询以获取计数并管理该数字以查看是否有另一行但我想避免这种情况.
我正在尝试用Python编写Haskel函数'splitEvery'.这是它的定义:
splitEvery :: Int -> [e] -> [[e]]
@'splitEvery' n@ splits a list into length-n pieces. The last
piece will be shorter if @n@ does not evenly divide the length of
the list.
Run Code Online (Sandbox Code Playgroud)
这个的基本版本工作正常,但我想要一个适用于生成器表达式,列表和迭代器的版本.并且,如果有一个发电机作为输入,它应该返回一个发电机作为输出!
# should not enter infinite loop with generators or lists
splitEvery(itertools.count(), 10)
splitEvery(range(1000), 10)
# last piece must be shorter if n does not evenly divide
assert splitEvery(5, range(9)) == [[0, 1, 2, 3, 4], [5, 6, 7, 8]]
# should give same …Run Code Online (Sandbox Code Playgroud) 最近我一直在编码了一堆不同的二叉搜索树实现(AVL,扇,树堆),并很好奇,如果有一个特别"好"的方式来写一个迭代器遍历这些结构.我现在使用的解决方案是让BST中的每个节点都存储指向树中下一个和前一个元素的指针,这会将迭代减少到标准的链表迭代.但是,我对这个答案并不满意.它通过两个指针(下一个和前一个)增加每个节点的空间使用量,在某种意义上它只是作弊.
我知道的构建,通过使用堆栈跟踪前沿节点的探索以后用0-1(H)的辅助存储空间(其中,h为树的高度),二叉搜索树迭代器的方式,但我由于内存的使用,我们拒绝对此进行编码.我希望有一些方法来构建一个只使用常量空间的迭代器.
我的问题是 - 有没有办法在具有以下属性的二叉搜索树上设计迭代器?
next()和hasNext()查询在O(1)时间内运行.为了更方便,它的罚款,如果你认为迭代(即没有插入,删除或旋转)在树形结构不改变形状,但如果有,确实可以处理这样的解决方案将是真的很酷.
如果我有这两个列表:
la = [1, 2, 3]
lb = [4, 5, 6]
Run Code Online (Sandbox Code Playgroud)
我可以按如下方式迭代它们:
for i in range(min(len(la), len(lb))):
print la[i], lb[i]
Run Code Online (Sandbox Code Playgroud)
或者更诡异
for a, b in zip(la, lb):
print a, b
Run Code Online (Sandbox Code Playgroud)
如果我有两本词典怎么办?
da = {'a': 1, 'b': 2, 'c': 3}
db = {'a': 4, 'b': 5, 'c': 6}
Run Code Online (Sandbox Code Playgroud)
再次,我可以手动迭代:
for key in set(da.keys()) & set(db.keys()):
print key, da[key], db[key]
Run Code Online (Sandbox Code Playgroud)
是否有一些内置方法允许我迭代如下?
for key, value_a, value_b in common_entries(da, db):
print key, value_a, value_b
Run Code Online (Sandbox Code Playgroud)