标签: iterator

从前向迭代器获取反向迭代器而不知道值类型

我正在尝试实现一些STL样式的排序算法.std::sort看起来像这样的原型(来自cplusplus.com):

template <class RandomAccessIterator>
void sort ( RandomAccessIterator first, RandomAccessIterator last );
Run Code Online (Sandbox Code Playgroud)

该函数通常被称为这样(虽然容器类型可以变化):

std::vector<int> myVec;
// Populate myVec
std::sort(myVec.begin(), myVec.end());
Run Code Online (Sandbox Code Playgroud)

我复制了std::sort我自己的排序功能的原型.要遍历要排序的容器,我执行以下操作:

template <class RandomAccessIterator>
void mySort(RandomAccessIterator first, RandomAccessIterator last) {  
  RandomAccessIterator iter;
  for (iter = first; iter != last; ++iter) {
    // Do stuff
  }
}
Run Code Online (Sandbox Code Playgroud)

很容易.但是如果我想使用反向迭代器呢?这在从两端对容器进行分类的算法中是方便的,例如鸡尾酒排序.

有没有办法从作为参数传入的迭代器中获取反向迭代器?如果我事先知道容器类型,我可以这样做:

template <class RandomAccessIterator>
void mySort(RandomAccessIterator first, RandomAccessIterator last) {
  std::vector<int>::reverse_iterator riter(last);
  std::vector<int>::reverse_iterator rend(first);
  for ( ; riter != rend; ++riter) {
    // Do stuff …
Run Code Online (Sandbox Code Playgroud)

c++ sorting iterator

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

如果迭代器为空,Python迭代器中下一个元素的默认值?

我有一个对象列表,我想找到第一个给定方法为某些输入值返回true的对象.这在Python中相对容易:

pattern = next(p for p in pattern_list if p.method(input))
Run Code Online (Sandbox Code Playgroud)

但是,在我的应用程序中,通常不存在这样pp.method(input)情况,因此这将引发StopIteration异常.有没有一种惯用的方法来处理这个而不用编写try/catch块?

特别是,似乎用类似if pattern is not None条件的东西处理这种情况会更干净,所以我想知道是否有一种方法可以扩展我的定义,pattern以便None在迭代器为空时提供一个值 - 或者如果还有更多Pythonic方式处理整体问题!

python iterator

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

Python成语链(flatten)无限可迭代的有限迭代?

假设我们有一个迭代器(一个无限的)返回列表(或有限迭代器),例如返回的一个

infinite = itertools.cycle([[1,2,3]])
Run Code Online (Sandbox Code Playgroud)

什么是一个很好的Python习惯用来获得一个迭代器(显然是无限的),它将从第一个迭代器返回每个元素,然后从第二个迭代器返回每个元素,等等.在上面的例子中它将返回1,2,3,1,2,3,....迭代器是无限的,所以itertools.chain(*infinite)不起作用.

有关

python iterator

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

在Java中使用一系列整数获取迭代器的最短方法

在Java中使用一系列整数获取迭代器的最短路径是什么?换句话说,实现以下内容:

/** 
* Returns an Iterator over the integers from first to first+count.
*/
Iterator<Integer> iterator(Integer first, Integer count);
Run Code Online (Sandbox Code Playgroud)

就像是

(first..first+count).iterator()
Run Code Online (Sandbox Code Playgroud)

java iterator

23
推荐指数
6
解决办法
3万
查看次数

如何检查STL迭代器是否指向任何东西?

可能重复:
C++检查迭代器是否有效的最佳方法

我想做这样的事情:

std::vector<int>::iterator it;
// /cut/ search for something in vector and point iterator at it. 
if(!it) //check whether found
    do_something(); 
Run Code Online (Sandbox Code Playgroud)

但是没有运营商!用于迭代器.如何检查迭代器是否指向任何东西?

c++ iterator stl

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

在lambda表达式中使用foreach循环的迭代器变量 - 为什么失败?

请考虑以下代码:

public class MyClass
{
   public delegate string PrintHelloType(string greeting);


    public void Execute()
    {

        Type[] types = new Type[] { typeof(string), typeof(float), typeof(int)};
        List<PrintHelloType> helloMethods = new List<PrintHelloType>();

        foreach (var type in types)
        {
            var sayHello = 
                new PrintHelloType(greeting => SayGreetingToType(type, greeting));
            helloMethods.Add(sayHello);
        }

        foreach (var helloMethod in helloMethods)
        {
            Console.WriteLine(helloMethod("Hi"));
        }

    }

    public string SayGreetingToType(Type type, string greetingText)
    {
        return greetingText + " " + type.Name;
    }

...

}
Run Code Online (Sandbox Code Playgroud)

调用后myClass.Execute(),代码打印以下意外响应:

Hi Int32
Hi Int32
Hi Int32  

很显然,我希望 …

c# lambda iterator

23
推荐指数
2
解决办法
9919
查看次数

Ruby将两个阵列合并为一个

这是我的情况.我有2个阵列

@names = ["Tom", "Harry", "John"]

@emails = ["tom@gmail.com", "h@gmail.com", "j@gmail.com"]
Run Code Online (Sandbox Code Playgroud)

我想将这两个组合成一些调用的Array/Hash,@list这样我就可以在我的视图中迭代这样的东西:

<% @list.each do |item| %>
<%= item.name %><br>
<%= item.email %><br>
<% end %>
Run Code Online (Sandbox Code Playgroud)

我无法理解如何实现这一目标.有什么想法吗?

ruby arrays hash iterator ruby-on-rails

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

将字符串拆分为迭代器

python是否有内置(意味着在标准库中)对产生迭代器而不是列表的字符串进行拆分?我想到了很长的字符串,不需要消耗大部分字符串.

python string iterator split

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

each_with_index_do从1开始索引

我在rails应用程序中的视图上使用ruby迭代器,如下所示:

<% (1..@document.data.length).each_with_index do |element, index| %>
  ...
<% end %>
Run Code Online (Sandbox Code Playgroud)

我认为增加了1 ..而不只是说: @document.data

会得到上面的索引从1开始的技巧.但是,唉,上面的代码索引仍然是0到data.length(-1有效).所以我做错了什么,我需要索引等于1-data.length ...没有线索如何设置迭代器来做到这一点.

ruby iterator ruby-on-rails-3

23
推荐指数
4
解决办法
3万
查看次数

如何压缩两个以上的迭代器?

是否有更直接,更易读的方法来完成以下任务:

fn main() {
    let a = [1, 2, 3];
    let b = [4, 5, 6];
    let c = [7, 8, 9];
    let iter = a.iter()
        .zip(b.iter())
        .zip(c.iter())
        .map(|((x, y), z)| (x, y, z));
}
Run Code Online (Sandbox Code Playgroud)

也就是说,如何从n个迭代中构建迭代器,从而产生n元组?

iterator rust

23
推荐指数
2
解决办法
5188
查看次数

标签 统计

iterator ×10

python ×3

c++ ×2

ruby ×2

arrays ×1

c# ×1

hash ×1

java ×1

lambda ×1

ruby-on-rails ×1

ruby-on-rails-3 ×1

rust ×1

sorting ×1

split ×1

stl ×1

string ×1