我想更多地了解iterators ,所以请纠正我,如果我错了。 迭代器是一个对象,它有一个指向下一个对象的指针,并被读作缓冲区或stream(即链表)。 他们是特别有效的,因为他们所做的只是告诉你什么是下一步引用,而不是使用索引。 但是我仍然不明白为什么会发生以下行为: In [1]: iter = (i for i in range(5)) In [2]: for _ in iter: ….: print _ ….: 0 1 2 3 4 In [3]: for _ in iter: ….: print _ ….: In [4]: 经过迭代器( In [2] )的第一次循环之后,就好像它已被消耗并留空,所以第二个循环( In [3] )不会打印任何东西。 但是我从来没有给itervariables赋值。 在for循环的底层真正发生了什么?
标准委员会于3月21 日投票批准了P0174中提出的std::iterator的弃用 : 对于读者来说,空的参数的长序列对于读者来说要简单得多,而不是简单地在类定义本身中提供预期的types定义,这是当前工作草案采用的方法,遵循C ++ 14中设置的模式 鼓励从std::iteratorinheritancePre-C ++ 17,从迭代器样板实现中移除繁琐的代码。 但是,弃用将需要这些东西之一: 迭代器样板现在需要包含所有必需的typedef 使用迭代器的algorithm现在需要使用auto而不是依赖迭代器来声明types Loki Astaribuild议 std::iterator_traits可以更新为无需inheritancestd::iterator 有人可以启发我,我应该期望哪些选项,因为我devise的自定义迭代器与C + + 17兼容性的眼睛?
如果我交换两个向量,它们的迭代器是否仍然有效,现在只是指向“其他”容器,或迭代器是否失效? 也就是说,给出: using namespace std; vector<int> x(42, 42); vector<int> y; vector<int>::iterator a = x.begin(); vector<int>::iterator b = x.end(); x.swap(y); // a and b still valid? Pointing to x or y? 这似乎没有提到这一点: [n3092 – 23.3.6.2] void swap(vector<T,Allocator>& x); 效果:将* this的内容和容量()与x的内容和容量()交换。 请注意,因为我在VS 2005中,我也对迭代器debugging检查等的影响感兴趣(_SECURE_SCL)
说我有一个std::list<int> lst和一些std::list<int>::iterator it迭代通过列表。 并依赖于it价值,我想在我的代码中使用it + 1或it – 1 。 是否有一些好的方法来做像next() , prev() (我无法在stl文档中find这样的东西)? 或者我应该每次复制it并增加(减less)副本?
我正在学习Perl并享受它。 我通常用Python做我的工作,但老板想要Perl。 Python和Perl中的大部分概念很好匹配:Python dictionary = Perl hash; Python元组= Perl列表; Python list = Perl数组; 等等 问题:是否有Perl版本的Pythonforms的迭代器 /生成器? 一个例子:一个经典的Python方法来生成斐波纳契数字是: #!/usr/bin/python def fibonacci(mag): a, b = 0, 1 while a<=10**mag: yield a a, b = b, a+b for number in fibonacci(15): print "%17d" % number 迭代器也是有用的,如果你想根据需要生成一个更大的列表子部分。 Perl'lists'看起来更加静态 – 更像是一个Python元组。 在Perl中,可以foreach是dynamic的还是只基于静态列表? Iterator的Pythonforms是一种我已经习惯的forms,我没有发现它在Perl中logging…除了写入循环或recursion或产生一个巨大的静态列表,我如何(为前)写在Perl中的斐波那契子程序? 有没有我失踪的Perl yield ? 具体来说 – 我怎么写这个: #!/usr/bin/perl […]
我可能会以错误的方式来解决这个问题,但是我想知道如何在Python中处理这个问题。 先来一些c代码: int i; for(i=0;i<100;i++){ if(i == 50) i = i + 10; printf("%i\n", i); } 好,所以我们从来没有看到50年代… 我的问题是,我怎么能做类似的Python? 例如: for line in cdata.split('\n'): if exp.match(line): #increment the position of the iterator by 5? pass print line 凭借我在Python中的有限经验,我只有一个解决scheme,引入一个计数器和另一个if语句。 打破循环,直到exp.match(行)为真后计数器达到5。 有一个更好的方法来做到这一点,希望不涉及导入另一个模块。 提前致谢!
为什么对象默认不能迭代? 我总是看到与迭代对象有关的问题,常见的解决scheme是迭代对象的属性,并以这种方式访问对象内的值。 这似乎很常见,这使我想知道为什么对象本身不可迭代。 像ES6 for…of这样的语句默认使用对象。 因为这些特性只适用于不包含{}对象的特殊“可迭代对象”,所以我们必须经过这些循环才能使这个对象成为我们想要使用的对象。 for …语句创build一个循环遍历可迭代对象 (包括Array,Map,Set,arguments object等)… 例如使用ES6 生成器function : var example = {a: {e: 'one', f: 'two'}, b: {g: 'three'}, c: {h: 'four', i: 'five'}}; function* entries(obj) { for (let key of Object.keys(obj)) { yield [key, obj[key]]; } } for (let [key, value] of entries(example)) { console.log(key); console.log(value); for (let [key, […]
我在互联网上找不到任何有效的例子,我可以看到他们之间的差异,以及为什么select一个。
我想知道当我将生成器函数的结果传递给python的枚举()时会发生什么。 例: def veryBigHello(): i = 0 while i < 10000000: i += 1 yield "hello" numbered = enumerate(veryBigHello()) for i, word in numbered: print i, word 枚举是懒惰迭代的,还是它把所有东西都塞进了第一个呢? 我99.999%肯定它是懒惰的,所以我可以把它和发电机function完全一样,还是需要注意什么?
我有一个AsIterator模板类,它采用类似数字的types,在本例中只是一个int ,并将其转换为一个迭代器( ++和–递增和递减数字, operator*只是返回一个引用)。 这工作正常, 除非它被包装到一个std::reverse_iterator和编译与任何优化 ( -O是足够的)。 当我优化二进制文件时,编译器会reverse_iterator对reverse_iterator的解引用调用,并用一些奇怪的值replace它。 必须指出,它仍然会进行正确的迭代次数 。 这只是反向迭代器获得的值是垃圾。 考虑下面的代码: #include <iterator> #include <cstdio> template<typename T> class AsIterator : public std::iterator<std::bidirectional_iterator_tag, T> { T v; public: AsIterator(const T & init) : v(init) {} T &operator*() { return v; } AsIterator &operator++() { ++v; return *this; } AsIterator operator++(int) { AsIterator copy(*this); ++(*this); […]