可能是一个n00b问题,但我目前有一个实现迭代器的类,所以我可以做类似的事情
for i in class():
Run Code Online (Sandbox Code Playgroud)
但我希望能够通过索引来访问类
class()[1]
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
谢谢!
ArrayList的列表迭代器确实实现了remove方法,但是,我得到以下抛出的异常:
UnsupportedOperationException at java.util.AbstractList.remove(AbstractList.java:144)
Run Code Online (Sandbox Code Playgroud)
通过此代码:
protected void removeZeroLengthStringsFrom(List<String> stringList)
{
ListIterator<String> iter = stringList.listIterator();
String s;
while (iter.hasNext())
{
s = iter.next();
if (s.length() == 0)
{
iter.remove();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?我已经证实List<String>我传入的确是ArrayList<String>.
谢谢!
我正在寻找std :: map的最高键值(由比较运算符定义).
这是保证
map.rbegin()->first
Run Code Online (Sandbox Code Playgroud)
?
(我在反向迭代器上有点不稳定,在std :: map的实现中有多少自由度)
如果没有,请告知.我无法改变数据结构.
执行以下操作并不显式处理文件对象并调用其close()方法是不好的做法吗?
for line in open('hello.txt'):
print line
Run Code Online (Sandbox Code Playgroud)
注意 - 这是针对尚未拥有该with语句的Python版本.
我问,因为Python文档似乎推荐这个: -
f = open("hello.txt")
try:
for line in f:
print line
finally:
f.close()
Run Code Online (Sandbox Code Playgroud)
这似乎比必要的更冗长.
考虑一下混淆代码.目的是通过匿名构造函数及其动态创建一个新对象yield return.目标是避免仅仅为了维护本地集合return.
public static List<DesktopComputer> BuildComputerAssets()
{
List<string> idTags = GetComputerIdTags();
foreach (var pcTag in idTags)
{
yield return new DesktopComputer() {AssetTag= pcTag
, Description = "PC " + pcTag
, AcquireDate = DateTime.Now
};
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这段代码会产生异常:
错误28'Foo.BuildComputerAssets()'的主体不能是迭代器块,因为'System.Collections.Generic.List'不是迭代器接口类型
问题
yield return正确使用?一种选择是使用渠道.通道在某种程度上类似于迭代器,您可以使用range关键字迭代它们.但是当你发现你不能在没有泄漏goroutine的情况下突破这个循环时,使用会变得有限.
在go中创建迭代器模式的惯用方法是什么?
编辑:
渠道的根本问题在于它们是推模型.迭代器是拉模型.你不必告诉iterator停止.我正在寻找一种以一种很好的表达方式迭代集合的方法.我还想链接迭代器(map,filter,fold alternative).
我想了解更多iterators,所以如果我错了请纠正我.
迭代器是一个对象,它具有指向下一个对象的指针,并被读取为缓冲区或流(即链接列表).它们特别有效,因为它们只是通过引用而不是使用索引来告诉您接下来的内容.
但是我仍然不明白为什么会发生以下行为:
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]:
Run Code Online (Sandbox Code Playgroud)
在通过迭代器(In [2])的第一个循环后,它就好像被消耗并留空,所以第二个循环(In [3])不打印任何内容.
但是我从未为iter变量赋予新值.
在for循环的引擎下真正发生了什么?
我有一个AsIterator模板类,它采用类似数字的类型,在这个例子中只是一个int,并将其转换为迭代器(++并--递增和递减数字,并operator*只返回对它的引用).
这工作正常,除非它被包装成a std::reverse_iterator并使用任何优化编译(-O足够).当我优化二进制文件时,编译器去除reverse_iterator对它的取消引用调用,并用一些奇怪的值替换它.必须注意的是,它仍然可以进行正确的迭代次数.它只是反向迭代器获得的值,即垃圾.
请考虑以下代码:
#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); return copy; }
AsIterator &operator--() { --v; return *this; }
AsIterator operator--(int) { AsIterator copy(*this); …Run Code Online (Sandbox Code Playgroud) 我可以使用迭代器进行正常计算,即只需通过添加数字来增加它吗?
例如,如果我想删除元素vec[3],我可以这样做:
std::vector<int> vec;
for(int i = 0; i < 5; ++i){
vec.push_back(i);
}
vec.erase(vec.begin() + 3); // removes vec[3] element
Run Code Online (Sandbox Code Playgroud)
它适用于我(g ++),但我不确定它是否可以保证工作.
向后循环python字符串的最佳方法是什么?
对于-1偏移的所有需要,以下似乎有点尴尬:
string = "trick or treat"
for i in range(len(string)-1, 0-1, -1):
print string[i]
Run Code Online (Sandbox Code Playgroud)
以下看起来更简洁,但实际上它是否产生了反向字符串,因此会有轻微的性能损失?
string = "trick or treat"
for c in string[::-1]:
print c
Run Code Online (Sandbox Code Playgroud)