标签: iterator

Python 3.0 - dict方法返回视图 - 为什么?

dict方法dict.keys(),dict.items()和dict.values()返回"views"而不是list. http://docs.python.org/dev/3.0/whatsnew//3.0.html

首先,视图与迭代器有何不同?其次,这种变化有什么好处?这只是出于性能原因吗?

这对我来说似乎不太直观,也就是说,我要求列出一些东西(给我所有的钥匙),然后我又得到了别的东西.这会让人迷惑吗?

language-features dictionary iterator python-3.x dictview

12
推荐指数
2
解决办法
3010
查看次数

12
推荐指数
6
解决办法
1513
查看次数

C++ STL:哪种迭代方法比STL容器更好?

这对你们中的一些人来说可能看起来很无聊,但是对于STL容器,以下哪两种迭代方法更好?为什么

class Elem;
typedef vector<Elem> ElemVec;
ElemVec elemVec;

// Method 0
for (ElemVec::iterator i = elemVec.begin(); i != elemVec.end(); ++i)
{
    Elem& e = *i;
    // Do something
}

// Method 1
for (int i = 0; i < elemVec.size(); ++i)
{
    Elem& e = elemVec.at(i);
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

方法0似乎更清晰STL,但方法1使用较少的代码实现相同.在容器上简单重复的事情似乎在以任何源代码的地方.所以,我倾向于选择方法1,这似乎可以减少视觉混乱和代码大小.

PS:我知道迭代器可以做的不仅仅是一个简单的索引.但是,请将回复/讨论集中在如上所示的容器上的简单迭代上.

c++ containers iterator stl

12
推荐指数
4
解决办法
3335
查看次数

Python迭代器 - 如何在新样式类中动态分配self.next?

作为一些WSGI中间件的一部分,我想编写一个包含迭代器的python类,以在迭代器上实现close方法.

当我尝试使用旧式类时,这可以正常工作,但是当我尝试使用新式类时会抛出TypeError.我需要做些什么来使用新式的类?

例:

class IteratorWrapper1:

    def __init__(self, otheriter):
        self._iterator = otheriter
        self.next = otheriter.next

    def __iter__(self):
        return self

    def close(self):
        if getattr(self._iterator, 'close', None) is not None:
            self._iterator.close()
        # other arbitrary resource cleanup code here

class IteratorWrapper2(object):

    def __init__(self, otheriter):
        self._iterator = otheriter
        self.next = otheriter.next

    def __iter__(self):
        return self

    def close(self):
        if getattr(self._iterator, 'close', None) is not None:
            self._iterator.close()
        # other arbitrary resource cleanup code here

if __name__ == "__main__":
    for i in IteratorWrapper1(iter([1, 2, 3])):
        print i

    for …
Run Code Online (Sandbox Code Playgroud)

python iterator

12
推荐指数
2
解决办法
4923
查看次数

使用scala迭代器中的项目

我对take特质中方法的行为感到困惑Iterator.它似乎不消耗物品.这是一个例子:

scala> Iterator(1,2,3)
res0: Iterator[Int] = non-empty iterator

scala> res0 take 2 toArray
res1: Array[Int] = Array(1, 2)

scala> res0.next
res2: Int = 1
Run Code Online (Sandbox Code Playgroud)

显然,步骤2消耗两个项目,但在步骤3 Iterator中仍然是第一个项目.看看实现,我看不到任何类型的复制或缓冲,只是一个新的Iterator委托给底层的.怎么可能呢?我怎样才能真正消耗n个物品?

iterator scala scala-collections

12
推荐指数
1
解决办法
6392
查看次数

std :: map迭代器是如何工作的?

C++ STL类std :: map使用二叉树实现O(log(n))查找.但是对于树,迭代器如何工作并不是很明显.++运算符在树结构中实际意味着什么?虽然"下一个元素"的概念在数组中有明显的实现,但对于我来说,它在树中并不那么明显.如何实现树迭代器?

c++ tree iterator map

12
推荐指数
2
解决办法
3244
查看次数

如何在Java中迭代向量并仅存储指定的类?

我有一个用例,我需要迭代Vector元素并将结果存储在say数组中,只要该实例是类method

这有什么容易的吗?

目前我这样做:

    Iterator itr = vec.iterator();
    Iterator element = vec.iterator();

    while(itr.hasNext())
    {
        boolean method = itr.next() instanceof Method;
        if(method)
            System.out.println( "\t" + ( (Method)(element.next()) ).name);
        else
            element.next();
    }
Run Code Online (Sandbox Code Playgroud)

但我认为会有比这更好的方法.

java iterator

12
推荐指数
2
解决办法
4万
查看次数

生成器表达式永远不会引发StopIteration

我自己答案的启发,甚至不了解它是如何起作用的,请考虑以下几点:

def has22(nums):
    it = iter(nums)
    return any(x == 2 == next(it) for x in it)


>>> has22([2, 1, 2])
False
Run Code Online (Sandbox Code Playgroud)

我预计会有一个StopIteration被提升,因为一旦到达2,next(it)就会推进消耗的迭代器.但是,对于生成器表达式,似乎已完全禁用此行为!break一旦发生这种情况,生成器表达似乎立即出现

>>> it = iter([2, 1, 2]); any(x == 2 == next(it) for x in it)
False
>>> it = iter([2, 1, 2]); any([x == 2 == next(it) for x in it])

Traceback (most recent call last):
  File "<pyshell#114>", line 1, in <module>
    it = iter([2, 1, …
Run Code Online (Sandbox Code Playgroud)

python iterator generator

12
推荐指数
1
解决办法
988
查看次数

具有返回迭代器的函数的trait

我正在尝试使用返回迭代器的函数构建一个特征.

我的简单示例如下所示:

pub trait TraitA {
    fn things(&self) -> Iterator<Item=&u8>;
}

fn foo<A: TraitA>(a: &A) {
    for x in a.things() { }
}
Run Code Online (Sandbox Code Playgroud)

哪个不起作用,因为在编译时不知道Iterator大小类型.

iterator traits rust

12
推荐指数
1
解决办法
1410
查看次数

在C++ 17中,为什么关联容器有一个`erase`成员函数,它接受(非`constst`)`iterator`?

参见,例如, http ://en.cppreference.com/w/cpp/container/map/erase

在C++ 03中有三个重载:

void erase( iterator pos );
void erase( iterator first, iterator last );
size_type erase( const key_type& key );
Run Code Online (Sandbox Code Playgroud)

在C++ 11中,第一和第二过载改变为采取const_iterator,使得它们可与任一被调用iteratorconst_iterator.第一次重载也通过在删除之后将迭代器返回到元素来改进:

iterator erase( const_iterator pos );
void erase( const_iterator first, const_iterator last );
size_type erase( const key_type& key );
Run Code Online (Sandbox Code Playgroud)

在C++ 17中,重新引入了非const重载:

iterator erase( const_iterator pos );
iterator erase( iterator pos );
void erase( const_iterator first, const_iterator last );
size_type erase( const key_type& key );
Run Code Online (Sandbox Code Playgroud)

为什么需要这个?它不加入为不等erase,也不是为insert …

c++ iterator stdmap const-iterator c++17

12
推荐指数
1
解决办法
323
查看次数