我怀疑我在这里做了些蠢事,但我对SPL的一个简单问题感到困惑:
如何使用RecursiveArrayIterator/RecursiveIteratorIterator修改数组的内容(本例中的值)?
使用以下测试代码,我可以使用getInnerIterator()和offsetSet()更改循环内的值,并在循环中转储已修改的数组.
但是当我离开循环并从迭代器转储数组时,它又回到了原始值.发生了什么?
$aNestedArray = array();
$aNestedArray[101] = range(100, 1000, 100);
$aNestedArray[201] = range(300, 25, -25);
$aNestedArray[301] = range(500, 0, -50);
$cArray = new ArrayObject($aNestedArray);
$cRecursiveIter = new RecursiveIteratorIterator(new RecursiveArrayIterator($cArray), RecursiveIteratorIterator::LEAVES_ONLY);
// Zero any array elements under 200
while ($cRecursiveIter->valid())
{
if ($cRecursiveIter->current() < 200)
{
$cInnerIter = $cRecursiveIter->getInnerIterator();
// $cInnerIter is a RecursiveArrayIterator
$cInnerIter->offsetSet($cInnerIter->key(), 0);
}
// This returns the modified array as expected, with elements progressively being zeroed
print_r($cRecursiveIter->getArrayCopy()); …Run Code Online (Sandbox Code Playgroud) 你知道一个JavaScript库,它为集合实现一个通用的Iterator类(可以是Arrays还是一些抽象的Enumerable),它具有一整套功能,比如Google Common 或Apache Commons?
编辑:Enumerable#each不是迭代器类.我正在寻找一个Iterator,它可以让我们写出类似的东西:
var iterator = new Iterator(myCollection);
for (var element = iterator.next(); iterator.hasNext(); element = iterator.next()) {
// iterator
}
Run Code Online (Sandbox Code Playgroud)
编辑:mamoo提醒我们Mozilla的Javascript 1.7中的Iterator实现.因此,现在的目标是在Javascript 1.5(ECMA 4)中找到此迭代器函数的实现.
Edit2:为什么在库(和ECMA 5)提供each方法时使用迭代器?首先,因为each通常会混淆this因为回调是call-ed(这就是为什么each在Prototype中接受第二个参数).然后,因为人们对for(;;)构造比对.each(callback)构造更熟悉(至少在我的领域).最后,因为迭代器可以迭代普通对象(参见JavaScript 1.7).
编辑3:我接受了npup的anwser,但这是我的镜头:
function Iterator(o, keysOnly) {
if (!(this instanceof arguments.callee))
return new arguments.callee(o, keysOnly);
var index = 0, keys = [];
if (!o || typeof o != "object") return;
if …Run Code Online (Sandbox Code Playgroud) 很多时候我需要在for循环中做两件事.简单地说,我可以使用迭代器设置for循环并进行两次:
for (i = 0; i < 2; i++)
{
// Do stuff
}
Run Code Online (Sandbox Code Playgroud)
现在我有兴趣尽可能简单地做这个,也许没有初始化器或迭代器?有没有其他的,非常简单和优雅的方法来实现这一目标?
我想知道是否有这样的方法通过扩展为java中的每个循环迭代多个集合.
所以类似于:
for (Object element : collection1, collection2, ....)
// do something ...
Run Code Online (Sandbox Code Playgroud)
谢谢
通常的STL结构是:
vector<string> col;
copy(istream_iterator<string>(cin), istream_iterator<string>(),
back_inserter(col));
Run Code Online (Sandbox Code Playgroud)
我们使用an istream_iterator从std input(cin)复制到向量.
谁能解释一下这段代码的工作原理
我的问题是我真的不明白这一部分:
istream_iterator<string>(cin), istream_iterator<string>()
Run Code Online (Sandbox Code Playgroud) 我可以将同一类型的连续数据成员视为范围吗?例如:
struct X
{
int a, b, c, d, e;
};
X x = {42, 13, 97, 11, 31};
std::sort(&x.a, &x.a + 5); // kosher?
Run Code Online (Sandbox Code Playgroud) 它在C++ Primer中有说明
在C++中,指针和数组紧密交织在一起.特别是,正如我们将看到的,当我们使用数组时,编译器通常会将数组转换为指针.
我想使用迭代器来打印数组.下面的程序运行正常但是当我尝试打印时,arr2或者arr3如果我没有弄错,哪种类型int *,我得到一个错误(判断&运算符意味着下面的参考).
error: no matching function for call to ‘begin(int*&)’
int main(int argc, char** argv) {
int arr[] = {0,1,2,3,4,5,6,7,8,9};
auto arr2 = arr;
auto arr3(arr); // I think arr2 and arr3 are of same type
for(auto it = std::begin(arr) ; it != std::end(arr) ; ++it)
std::cout << *it << " ";
std::cout << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
考虑到该语句,如果数组被编译器转换为指针,该程序如何用于打印arr使用的内容,std::begin()并且std::end() 不起作用arr2或者 …
javascript WeakMap(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)不允许您按设计获取密钥或长度或大小.
是否有可能以某种方式循环条目?
如果没有.. Chrome控制台如何执行此操作?
我有一个模板函数,我想在其中生成一个未知类型的向量.我试图让它自动,但编译器说它是不允许的.
模板函数获取迭代器或指针,如后面的main函数中的测试程序中所示.如何解决问题?
template<class Iter>
auto my_func(Iter beg, Iter end)
{
if (beg == end)
throw domain_error("empty vector");
auto size = distance(beg, end);
vector<auto> temp(size); // <--HERE COMPILER SAYS CANNOT BE AUTO TYPE
copy(beg, end, temp->begin);
.
.
return ....
}
int main()
{
int bips[] = {3, 7, 0, 60, 17}; // Passing pointers of array
auto g = my_func(bips, bips + sizeof(bips) / sizeof(*bips));
vector<int> v = {10, 5, 4, 14}; // Passing iterators of a vector
auto h …Run Code Online (Sandbox Code Playgroud) 我想实现Iterator包含可迭代字段的结构的特征。迭代我的结构应该产生与迭代该字段获得的相同结果。这就是我想要的(显然不起作用):
struct Foo {
bar: Vec<char>,
}
impl Iterator for Foo {
type Item: &char; // Error: expected named lifetime parameter
fn next(&mut self) -> Option<Self::Item> {
self.bar.iter().next()
}
}
Run Code Online (Sandbox Code Playgroud)
为了避免该错误,我尝试插入生命周期:
use std::marker::PhantomData;
struct Foo<'a> {
bar: Vec<char>,
phantom: &'a PhantomData<char> // not sure what to put inside < .. >
}
impl<'a> Iterator for Foo<'a> {
type Item = &'a char;
fn next(&mut self) -> Option<Self::Item> {
self.bar.iter().next() // again, several errors about lifetimes
}
}
Run Code Online (Sandbox Code Playgroud)
我如何实现 …