标签: iterator

使用RecursiveArrayIterator时如何更改数组键和值?

我怀疑我在这里做了些蠢事,但我对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)

php spl iterator arrayiterator

16
推荐指数
3
解决办法
4801
查看次数

JavaScript Iterator类

你知道一个JavaScript库,它为集合实现一个通用的Iterator类(可以是Arrays还是一些抽象的Enumerable),它具有一整套功能,比如Google CommonApache 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)

javascript iterator

16
推荐指数
2
解决办法
2万
查看次数

在C中循环TWICE最优雅的方法是什么

很多时候我需要在for循环中做两件事.简单地说,我可以使用迭代器设置for循环并进行两次:

for (i = 0; i < 2; i++)
{
 // Do stuff
}
Run Code Online (Sandbox Code Playgroud)

现在我有兴趣尽可能简单地做这个,也许没有初始化器或迭代器?有没有其他的,非常简单和优雅的方法来实现这一目标?

c iterator loops

16
推荐指数
7
解决办法
1万
查看次数

在同一个"for"循环中迭代多个集合?

我想知道是否有这样的方法通过扩展为java中的每个循环迭代多个集合.

所以类似于:

for (Object element : collection1, collection2, ....)
         // do something ...
Run Code Online (Sandbox Code Playgroud)

谢谢

java syntax iterator for-loop

16
推荐指数
1
解决办法
7744
查看次数

std :: copy如何与流迭代器一起使用

通常的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)

c++ iterator stl stream

16
推荐指数
2
解决办法
1万
查看次数

数据成员是否形成范围?

我可以将同一类型的连续数据成员视为范围吗?例如:

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++ iterator stl object-layout c++11

16
推荐指数
2
解决办法
479
查看次数

在数组上使用迭代器

它在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或者 …

c++ arrays pointers iterator c++11

16
推荐指数
1
解决办法
8638
查看次数

如何迭代弱图?

javascript WeakMap(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)不允许您按设计获取密钥或长度或大小.

是否有可能以某种方式循环条目?

如果没有.. Chrome控制台如何执行此操作?

在此输入图像描述

javascript garbage-collection iterator weakmap

16
推荐指数
2
解决办法
5840
查看次数

在C++中初始化模板函数内的auto(未知)类型的向量

我有一个模板函数,我想在其中生成一个未知类型的向量.我试图让它自动,但编译器说它是不允许的.

模板函数获取迭代器或指针,如后面的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)

c++ templates iterator stl

16
推荐指数
3
解决办法
3568
查看次数

为包含可迭代字段的结构实现迭代器特征

我想实现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)

我如何实现 …

iterator traits rust

16
推荐指数
1
解决办法
6053
查看次数