如果我为myList设置了一个迭代器:
Iterator iter = myList.iterator();
while(iter.hasNext())
{
MyObj myObj = (MyObj)iter.next();
doPrint(myObj.toString());
}
Run Code Online (Sandbox Code Playgroud)
我称之为第二次:
while(iter.hasNext())
{
MyObj myObj = (MyObj)iter.next();
doPrint(myObj.toString());
}
Run Code Online (Sandbox Code Playgroud)
我第二次打电话给它时会回到收藏的开头吗?
g ++确实__restrict__为指针实现,但我找不到任何关于迭代器的东西.我的总体意图是鼓励编译器对stl循环进行矢量化.
编辑:
即使编译器无法进行向量化,__restrict__关键字也应该能够告诉编译器在循环内不需要不必要的重新加载.
我有一个字符串,我需要分成2个字母的部分.例如,'ABCDXY'应该成为['AB', 'CD', 'XY'].在奇数个字符的情况下的行为可以完全是任意的(我将提前检查长度).
没有丑陋的循环有没有办法做到这一点?
考虑在此JSON对象中表达的以下(相当复杂的)查询:
{
"name": "Kindle Fire",
"sale": true,
"price": {
"$gt": 199,
"$lt": 264
},
"price.vat": { // bogus, just to show $a['price.vat'] == $a['price']['vat']
"$lte": 1.2
},
"$or": {
"qty": {
"$gt": 30
},
"eta": {
"$or": {
"$lt": 3,
"$gt": 30
}
}
},
"countriesAvailable": {
"$in": [
"US",
"CA"
]
}
}
Run Code Online (Sandbox Code Playgroud)
我想解析那个JSON,以便它计算到PHP的等价物($a我的目标数据在哪里):
$a['name'] == 'Kindle Fire' &&
$a['sale'] == true &&
(
$a['price'] > 199 && $a['price'] < 264
) &&
$a['price']['vat'] <= 1.2 …Run Code Online (Sandbox Code Playgroud) 我正在阅读有关ConcurrentModificationException以及如何避免它的内容.找到一篇文章.该文章中的第一个列表的代码类似于以下内容,这显然会导致异常:
List<String> myList = new ArrayList<String>();
myList.add("January");
myList.add("February");
myList.add("March");
Iterator<String> it = myList.iterator();
while(it.hasNext())
{
String item = it.next();
if("February".equals(item))
{
myList.remove(item);
}
}
for (String item : myList)
{
System.out.println(item);
}
Run Code Online (Sandbox Code Playgroud)
然后它继续解释如何用各种建议解决问题.
当我试图重现它时,我没有得到例外!为什么我没有得到例外?
我最近读了一本书"The Java Tutorials"第3版.它如图所示讨论了内部类的实现.
在第3段中,它说"Stack类本身不应该实现Iterator接口,因为......".
我找不到Stack类不应该实现Iterator的任何原因.给出的理由不是透彻的.
你能解释一下吗?

我有一个元素的迭代器,我想消耗它们,直到下一个元素满足条件,如:
val it = List(1,1,1,1,2,2,2).iterator
val res1 = it.takeWhile( _ == 1).toList
val res2 = it.takeWhile(_ == 2).toList
Run Code Online (Sandbox Code Playgroud)
res1给出一个预期List(1,1,1,1)但res2返回,List(2,2)因为迭代器必须检查位置4中的元素.
我知道列表将被订购,所以没有必要像遍历那样遍历整个列表partition.我希望在条件不满足时立即完成.是否有任何聪明的方法与迭代器一起做这个?我不能toList对迭代器做一个因为它来自一个非常大的文件.
是否有使用ES6生成器使流可迭代的模式?
请参阅下面的"MakeStreamIterable".
import {createReadStream} from 'fs'
let fileName = 'largeFile.txt'
let readStream = createReadStream(fileName, {
encoding: 'utf8',
bufferSize: 1024
})
let myIterableAsyncStream = MakeStreamIterable(readStream)
for (let data of myIterableAsyncStream) {
let str = data.toString('utf8')
console.log(str)
}
Run Code Online (Sandbox Code Playgroud)
我对co或bluebird的协程或deasync阻塞不感兴趣.
黄金是MakeStreamIterable应该是一个有效的函数.
这工作,因为Iterator工具rev(),其中self是DoubleEndedIterator:
let vec: Vec<i32> = Vec::new();
for x in vec.iter().rev() {
//Do stuff
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我改变vec.iter().rev()到&vec.rev()它不会因为编译:
Run Code Online (Sandbox Code Playgroud)no method named `rev` found for type `std::vec::Vec<i32>` in the current scope
此外:
Run Code Online (Sandbox Code Playgroud)the method `rev` exists but the following trait bounds were not satisfied: `std::vec::Vec<i32> : std::iter::Iterator`, `[i32] : std::iter::Iterator`
但是for循环不会隐式调用IntoIterator吗?是&vec或被vec.iter()认为是惯用的Rust?
我想std::vector在for循环中迭代一些s,但是根据某些条件,向量应该向前或向后迭代.我想,我可以通过使用普通迭代器或反向迭代器来轻松实现,如下所示:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec{0, 1, 2, 3, 5, 6, 7};
bool reverse = true;
std::iterator<random_access_iterator_tag, int> it, end_it;
if (reverse) {
it = vec.rbegin();
end_it = vec.rend();
} else {
it = vec.begin();
end_it = vec.end();
}
for (; it != end_it; it++) {
cout << *it << ", ";
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但不幸的是vector::begin(),vector::rbegin()似乎并没有使用相同的父类.是否有另一种方法可以做我想要的,而不在if-else结构中有两个不同的循环?当然我可以为循环体创建一个函数/ lambda或者使用一些索引算法但是有更优雅的方法吗?
编译器抱怨分配,it = vec.begin()因为它们是不同的类型.gcc和VC++输出不同的错误,似乎使用不同的类型作为返回值vector::begin.
iterator ×10
java ×3
c++ ×2
arraylist ×1
arrays ×1
collections ×1
ecmascript-6 ×1
evaluation ×1
for-loop ×1
iteration ×1
javascript ×1
php ×1
python ×1
python-3.x ×1
rust ×1
scala ×1
stdvector ×1
stream ×1
string ×1