Tag: 迭代器

C ++迭代器认为有害?

在今天的Boost图书馆大会上,“现代C ++devise”和Loki C ++图书馆的作者Andrei Alexandrescu就“迭代器必须去”( video , 幻灯片 )这个话题做了一个演讲,讨论迭代器为什么不好,他有一个更好的解决scheme。 我试图阅读演示幻灯片,但是我无法从中得到很多。 迭代器是坏的? 他的replace是否真的更好? C ++实现者会提出他的想法吗?

与Python列表混淆:他们还是不是迭代器?

我正在研究Alex Marteli的Python in the Nutshell ,本书指出任何具有next()方法的对象都是(或者至less可以用作) 迭代器 。 它也表明大多数迭代器是通过对称为iter的方法的隐式或显式调用来构build的。 在读完这本书之后,我觉得有尝试的冲动。 我启动了一个Python 2.7.3解释器,并做到了这一点: >>> x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> for number in range(0, 10): … print x.next() 但结果是这样的: Traceback (most recent call last): File "<stdin>", line 2, in <module> AttributeError: 'list' object has no attribute 'next' 在困惑中,我试图通过dir(x)来研究x对象的结构,我注意到它有一个__iter__函数对象。 所以我发现它可以用作迭代器,只要它支持这种types的接口。 […]

为什么在一个类上定义__getitem__可以在Python中迭代呢?

为什么在一个类上定义__getitem__使其迭代? 例如,如果我写: class b: def __getitem__(self, k): return k cb = b() for k in cb: print k 我得到的输出: 0 1 2 3 4 5 6 7 8 … 我真的希望看到一个错误返回从“for c in cb:”

计算生成器/迭代器中项目数量的最简单方法是什么?

如果我想要一个迭代中的项目数量,而不关心这些元素本身,那么将会是什么样的pythonic方式呢? 现在,我会定义 def ilen(it): return sum(itertools.imap(lambda _: 1, it)) # or just map in Python 3 但我知道lambda已经接近被认为是有害的了,而lambda _: 1肯定不是很漂亮。 (用法是计算匹配正则expression式的文本文件中的行数,即grep -c 。)

我怎样才能遍历一个string,也知道索引(当前位置)?

通常在迭代string(或任何可枚举对象)时,我们不仅对当前值感兴趣,而且对位置(索引)也感兴趣。 要通过使用string::iterator来实现这一点,我们必须保持一个单独的索引: string str ("Test string"); string::iterator it; int index = 0; for ( it = str.begin() ; it < str.end(); it++ ,index++) { cout << index << *it; } 以上的风格似乎并不比“C风格” string str ("Test string"); for ( int i = 0 ; i < str.length(); i++) { cout << i << str[i] ; } 在Ruby中,我们可以通过优雅的方式获得内容和索引: […]

使用C ++ vector :: insert()添加到向量的末尾

我写了一小段代码,我必须根据向量元素中的值,将值插入到某个地方的C ++ STL向量中。 我正在使用insert()函数来完成此操作。 我意识到,当我想添加一个新的元素到vector的末尾,我可以简单地使用push_back() 。 但为了保持我的代码看起来不错,我想独占地使用insert() ,它将所需的插入点和要插入的值之后的迭代器指向元素。 如果作为参数传入的迭代器的值是v.end() ,其中v是我的向量,这将与push_back()一样工作吗? 非常感谢!

通过AS3字典高效循环

for (var k in dictionary) { var key:KeyType = KeyType(k); var value:ValType = ValType(dictionary[k]); // <– lookup // do stuff } 这是我用来循环字典中的条目。 正如你在每次迭代中所看到的,我在字典中执行查找。 是否有更有效的迭代字典(同时保持访问键)?

我怎样才能删除迭代器的std :: map的元素?

我想通过一个std::map循环,并根据其内容删除项目。 这个怎么做最好?

如何增加一个迭代器2?

任何人都可以告诉我如何增加迭代器2? iter++可用 – 我必须做iter+2吗? 我怎样才能做到这一点?

当它指向vector的最后一个元素时,如果我将迭代器增加2,该怎么办?

在这个问题中 ,如何通过2个元素来调整迭代器到STL容器,提供了两种不同的方法: 要么使用算术运算符的forms – + = 2或++两次 或使用std :: advance() 当迭代器指向STL容器的最后一个元素或更高版本时,我已经用VC ++ 7testing了它们的边界情况: vector<int> vec; vec.push_back( 1 ); vec.push_back( 2 ); vector<int>::iterator it = vec.begin(); advance( it, 2 ); bool isAtEnd = it == vec.end(); // true it++; // or advance( it, 1 ); – doesn't matter isAtEnd = it == vec.end(); //false it = […]