标签: 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
查看次数

C++中的多态迭代器

我正在尝试在C++中实现多态迭代器.基本上,我需要这个能够应用一个过滤器,以便迭代器可以跳过一些项目,具体取决于相关的条件.所以我使用抽象接口创建了一个类似GoF的迭代器,这允许我从中派生一个过滤迭代器并实现所需的逻辑.我也更喜欢基于接口的迭代器而不是模板化的迭代器,因为它们允许隐藏实现而不会导致一堆鸭类模板.

但是,多态迭代器不能通过值返回(与STL迭代器相反),所以我必须传递指针,这很容易变得危险,就像在这种情况下,这似乎是合乎逻辑的,但会导致内存泄漏:

Iter* Collection::GetIter() {...} // new IterImpl
DoSomething(Iter*) {...} // doesn't do delete

DoSomething(Collection.GetIter()); // convenient, but wrong :\
Run Code Online (Sandbox Code Playgroud)

显而易见的解决方案是使用某种智能指针来控制迭代器的生命周期,但人们常说接口应该尽可能简单和通用,因此应该避免使用智能指针?

如果你在C++中使用过多态迭代器,那么这个问题是如何解决的?或者基于模板的迭代器是C++中唯一"好"的迭代方式?谢谢.

c++ polymorphism iterator

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

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

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

所以类似于:

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

谢谢

java syntax iterator for-loop

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

计算PHP DatePeriod()的迭代次数

我理解日期是如何工作的,有一个例外,有没有办法从日期周期中找出有多少个区间?

例如:

// define the period of the range
$period = new DatePeriod($begin, $rangeType, $end);

// iterate through the dates in range
foreach ( $period as $dt ) {
}
Run Code Online (Sandbox Code Playgroud)

这是我想从上面的代码做的事情:

echo count($period);
Run Code Online (Sandbox Code Playgroud)

基本上我想知道foreach循环结束运行的时间.

php datetime iterator

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

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万
查看次数

在数组上使用迭代器

它在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
查看次数

使用Iterator collect键入问题

我正在尝试使用以下代码片段将对矢量转换&str为a HashMap:

use std::collections::HashMap;

fn main() {
  let pairs = vec!(("foo", "bar"), ("toto", "tata"));
  let map: HashMap<&str, &str> = pairs.iter().collect();
  println!("{:?}", map);
}
Run Code Online (Sandbox Code Playgroud)

但是编译失败并出现此错误:

<anon>:5:47: 5:56 error: the trait `core::iter::FromIterator<&(&str, &str)>` is not implemented for the type `std::collections::hash::map::HashMap<&str, &str>` [E0277]
<anon>:5   let map: HashMap<&str, &str> = pairs.iter().collect();
Run Code Online (Sandbox Code Playgroud)

但是,如果我.cloned()在调用之前添加collect()一切正常:

...
let map: HashMap<&str, &str> = pairs.iter().cloned().collect();
...
Run Code Online (Sandbox Code Playgroud)

即使我理解错误消息(没有FromIterator<&(&str, &str)>该类型的特征的实现HashMap<&str, &str>)我不明白类型&(&str, &str)来自哪里(根据Rust文档中的方法签名)以及为什么调用cloned()修复这个问题.

iterator rust

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

在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
查看次数

为什么ConcurrentSkipListSet升序迭代器比降序迭代器更快?

我在ConcurrentSkipListSet上使用了descendingIterator方法.我刚检查了文档并注意到以下注释:

'升序有序视图及其迭代器比下行视图更快.

请参阅https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentSkipListSet.html#descendingIterator--

不幸的是,它没有提供任何关于此的更多信息.有什么样的性能差异?它有意义吗?为什么会有性能差异?

java collections iterator java.util.concurrent

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

我们可以在没有'advance'功能的情况下增加多个位置的迭代器吗?

我知道我们可以使用advance()函数来增加迭代器.我们还使用iterator++一个位置来增加迭代器.为什么我们不能使用it+=2

int main()
{
    list<int> l1{1, 2, 3, 5, 6};
    list<int> l2{2, 6, 8};
    auto it = l1.begin();
    advance(it, 2);         //works
    it++;                   //works
    // it+=2;                  //not work
    l2.splice(l2.begin(), l1, it);

    for(int a: l2) cout<<a<<" ";
    cout<<endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处运行上述代码.

c++ iterator listiterator c++11

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