如何在 Cython 中将 std:set 迭代器增加一个以上?

问题描述

我有一个 C++ std:set,我想在 Cython 中为其实现“假”索引。假设我有一个包装集合的扩展类型,我想要一个方法 get_member(int i) 返回集合中的第 i 个元素。这就是我得到的,基本上使用 cython.operator.preincrement 迭代集合,直到达到所需的点,然后取消引用当前迭代器位置:

# distutils: language = c++

from cython.operator cimport dereference,preincrement
from libcpp.set cimport set as cppset

cdef class SetWrapper:
    
    cdef cppset[int] _set
    
    def __cinit__(self,s: set = None):
        if s is not None:
            self._set = s
    
    cpdef int get_member(self,int i):
        cdef cppset[int].iterator it = self._set.begin()
        cdef int count 
        
        # Would it be possible to increment it directly by i?
        for count in range(i):
            preincrement(it)
            
        return dereference(it)

test_set = SetWrapper({1,2,3})
test_set.get_member(2)
# 3

虽然这行得通,但当可以直接通过 i 位置递增迭代器时,总是迭代集合似乎有点浪费。这在某种程度上可能吗?

PS:让我们抛开这样一个事实,即这不是人们应该使用集合来...

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)