标签: iterator

在Python中的迭代器之间交替

在Python中替换从不同迭代器获取值的最有效方法是什么,例如,alternate(xrange(1, 7, 2), xrange(2, 8, 2))它将产生1,2,3,4,5,6.我知道实现它的一种方法是:

def alternate(*iters):
    while True:
        for i in iters:
            try:
                yield i.next()
            except StopIteration:
                pass
Run Code Online (Sandbox Code Playgroud)

但是有更高效或更清洁的方式吗?(或者,更好的是,itertools我错过了一个功能?)

python iterator

9
推荐指数
3
解决办法
5024
查看次数

std :: list iterator:获取下一个元素

我正在尝试使用存储在std :: list中的数据元素来构建一个字符串,我希望逗号只放在元素之间(即,如果元素是列表中的{A,B,C,D},结果字符串应该是"A B C D".

此代码不起作用:

typedef std::list< shared_ptr<EventDataItem> > DataItemList;
// ...
std::string Compose(DataItemList& dilList)
{
    std::stringstream ssDataSegment;
    for(iterItems = dilList.begin();
        iterItems != dilList.end(); 
        iterItems++)
    {
        // Lookahead in list to see if next element is end
        if((iterItems + 1) == dilList.end())  
        {
            ssDataSegment << (*iterItems)->ToString();
        }
        else
        {
            ssDataSegment << (*iterItems)->ToString() << ",";
        }
    }
    return ssDataSegment.str();
}
Run Code Online (Sandbox Code Playgroud)

如何使用迭代器获取std :: list中的"the-next-item"?我希望它是一个链表,为什么我不能进入下一个项目?

c++ iterator stl list

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

迭代器类的指南

我有一个用c ++实现的红黑.它支持STL映射的功能.树节点包含键和映射的值.我想为此编写一个迭代器类,但我仍然坚持如何做到这一点.我应该将它作为Tree类的内部类吗?任何人都可以给我一些指导如何写它+一些资源?

谢谢!!

c++ templates iterator red-black-tree

9
推荐指数
1
解决办法
4261
查看次数

结构解引用运算符(operator->)

我正在为迭代器编写一个瘦模板包装器,并在通过结构解除引用操作符时遇到绊脚石,主要是因为指针没有:

#include <vector>

struct mystruct {
    int member;
};

template<class iterator>
struct wrap {
   typedef typename std::iterator_traits<iterator>::pointer pointer;
   iterator internal;
   pointer operator->() {return internal.operator->();} //MARK1
};

int main() {
    wrap<std::vector<mystruct>::iterator> a;
    a->member;
    wrap<mystruct*> b;
    b->member;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/XdvEz

prog.cpp: In member function ‘typename std::iterator_traits<_Iter>::pointer wrap<iterator>::operator->() [with iterator = mystruct*]’:
prog.cpp:18:   instantiated from here
prog.cpp:11: error: request for member ‘operator->’ in ‘((wrap<mystruct*>*)this)->wrap<mystruct*>::internal’, which is of non-class type ‘mystruct*’
Run Code Online (Sandbox Code Playgroud)

以下方法有效,但我不认为它可以工作.也就是说,如果迭代器的奇怪pointer类型与指向a的指针不同value_type.

   pointer operator->() {return &*internal;} //MARK3
Run Code Online (Sandbox Code Playgroud)

c++ templates iterator operator-overloading

9
推荐指数
1
解决办法
4618
查看次数

如何在Python中加入链接以获得循环?

我有一个链接列表,想知道连接的路径/周期.

我的链接看起来像这样:

[[0, 3], [1, 0], [3, 1]]
Run Code Online (Sandbox Code Playgroud)

我希望答案是这样的循环(或任何其他匹配循环):

[0,3,1]
Run Code Online (Sandbox Code Playgroud)

因此,您获取第一个子列表的第一个元素,然后您获取第二个元素,并查找以此元素开头的下一个子列表,然后重新开始.

有一种优雅的方式来实现这一目标吗?我尝试了reduce函数,但是链接必须以链接匹配的方式进行排序.

python reduce iterator functional-programming list

9
推荐指数
2
解决办法
257
查看次数

如何使用Iterator打印列表(员工类型)?

员工类:

public class Employee {

    int empid;
    String name;
    int age;

    public Employee(int empid,String name,int age)
    {
        this.empid=empid;
        this.name=name;
        this.age=age;
    }
    public int getEmpid() {
        return empid;
    }
    public void setEmpid(int empid) {
        this.empid = empid;
    }
    public String getname() {
        return name;
    }
    public void setname(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    } 
}
Run Code Online (Sandbox Code Playgroud)

比较类:

public class Employee_comparator implements Comparator<Employee> {

    @Override
    public int …
Run Code Online (Sandbox Code Playgroud)

java iterator

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

迭代器串联性能

正下方,的代码Iterator++方法:

/** Concatenates this iterator with another.
       *
       *  @param   that   the other iterator
       *  @return  a new iterator that first yields the values produced by this
       *  iterator followed by the values produced by iterator `that`.
       *  @note    Reuse: $consumesTwoAndProducesOneIterator
       *  @usecase def ++(that: => Iterator[A]): Iterator[A]
       */
      def ++[B >: A](that: => GenTraversableOnce[B]): Iterator[B] = new Iterator[B] {
        // optimize a little bit to prevent n log n behavior.
        private var cur : Iterator[B] …
Run Code Online (Sandbox Code Playgroud)

algorithm performance iterator scala

9
推荐指数
1
解决办法
476
查看次数

如果我使用vector :: begin()而不是std :: back_inserter(vector)来输出set_intersection会发生什么?

我一直在使用高度简洁和直观的C++语法来查找两个已排序的vectors并将结果放在第三个中vector:

vector<bar> a,b,c;
//...
std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),
                      std::back_inserter(c));
Run Code Online (Sandbox Code Playgroud)

这应该设置c为交集(a,b),假设ab排序.

但是,如果我只是使用c.begin()(我以为我在某个地方看到了一个例子,这就是我做的原因):

 std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),
                       c.begin());
Run Code Online (Sandbox Code Playgroud)

set_intersection期望OutputIteratorat参数.我认为标准只需要c.begin()返回a forward iterator,我想这可能是也可能不是OutputIterator.

无论如何,代码与c.begin()编译下铿锵.

保证在标准下发生什么?如果这编译,可能发生的事情 - 也就是说,当返回的迭代器c.begin()最终递增超过向量的末尾,并且尝试访问指向的元素时,必须/可能发生什么?在这种情况下,符合标准的实现是否可以无声地扩展向量,因此begin()实际上是一个OutputIterator类似的附加back_inserter

我问这个主要是为了理解标准如何与迭代器一起工作:真正发生了什么,所以我可以使用STL超越复制和粘贴.

c++ containers iterator vector set-intersection

9
推荐指数
3
解决办法
1744
查看次数

迭代列表并精美地处理Python中的StopIteration

我正在尝试遍历列表,我需要在迭代到达列表末尾时执行特定操作,请参阅下面的示例:

data = [1, 2, 3]

data_iter = data.__iter__()
try:
    while True:
        item = data_iter.next()
        try:
            do_stuff(item)
            break # we just need to do stuff with the first successful item
        except:
            handle_errors(item) # in case of no success, handle and skip to next item
except StopIteration:
    raise Exception("All items weren't successful")
Run Code Online (Sandbox Code Playgroud)

我相信这段代码不是Pythonic,所以我正在寻找更好的方法.我认为理想的代码应该看起来像下面的假设:

data = [1, 2, 3]

for item in data:
    try:
        do_stuff(item)
        break # we just need to do stuff with the first successful item
    except:
        handle_errors(item) # in …
Run Code Online (Sandbox Code Playgroud)

python iterator list stopiteration

8
推荐指数
1
解决办法
8812
查看次数

使用remove_if从C++向量中删除索引

我们可以在C++中使用remove_if来基于对元素进行操作的谓词在线性时间中从向量中移除元素.

bool condition(double d) {...}

vector<double> data = ...
std::remove_if (data.begin(), data.end(), condition);
Run Code Online (Sandbox Code Playgroud)

如果我的条件不依赖于价值,而是依赖指数怎么办?换句话说,如果我想删除所有奇数索引元素,或某些任意索引集等?

bool condition(int index) {//returns whether this index should be removed}

vector<double> data = ...
std::remove_if (data.begin(), data.end(), ???);
Run Code Online (Sandbox Code Playgroud)

c++ indexing iterator vector remove-if

8
推荐指数
2
解决办法
3768
查看次数