标签: iterator

测试迭代器是否指向最后一项?

我有一个由std :: find()生成的stl迭代器,并希望测试它是否是最后一个元素.写这个的一种方法如下:

mine *match = someValue;
vector<mine *> Mine(someContent);
vector<mine *>::iterator itr = std::find(Mine.begin(), Mine.end(), match);

if (itr == --Mine.end()) {
  doSomething;
}
Run Code Online (Sandbox Code Playgroud)

但在我看来,递减end()迭代器是在寻求麻烦,例如如果向量没有元素,那么它将是未定义的.即使我知道它永远不会是空的,它仍然看起来很难看.我想也许rbegin()是可行的方法,但我不确定将前向迭代器与反向迭代器进行比较的最佳方法.

c++ iterator stl

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

如何检查传递的Iterator是一个随机访问迭代器?

我有以下代码,它执行一些迭代器算术:

template<class Iterator>
void Foo(Iterator first, Iterator last) {
  typedef typename Iterator::value_type Value;
  std::vector<Value> vec;
  vec.resize(last - first);
  // ...
}
Run Code Online (Sandbox Code Playgroud)

(last - first)表达的作品(据我所知)仅适用于随机访问迭代器(像的那些vectordeque).如何检查传递的迭代器满足此要求的代码?

c++ iterator stl

30
推荐指数
2
解决办法
6210
查看次数

C++中的自定义迭代器

我有一个类TContainer,它是指向TItems类的几个stl集合指针的集合.

我需要创建一个迭代器来遍历我的TContainer类中所有集合中的元素,从而抽象出内部工作的客户端.

这样做有什么好办法?我应该创建一个扩展迭代器的类(如果是这样,我应该扩展什么迭代器类),我应该创建一个迭代器类,它是迭代器的集合吗?

我只需要一个FORWARD_ONLY迭代器.

IE,如果这是我的容器:

typedef std::vector <TItem*> ItemVector;
class TContainer {
   std::vector <ItemVector *> m_Items;
};
Run Code Online (Sandbox Code Playgroud)

遍历m_Items成员变量向量中包含的所有项的好迭代器是什么.

c++ iterator stl

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

增加迭代器:++它比++更有效吗?

可能重复:
在C++中i ++和++ i之间是否存在性能差异?

我正在编写一个程序,其中迭代器用于循环std :: vector.有人告诉我,在for语句中执行++会导致更高效的代码.换句话说,他们说:

for ( vector<string>::iterator it=my_vector.begin(); it != my_vector.end(); ++it )
Run Code Online (Sandbox Code Playgroud)

比跑得快

for ( vector<string>::iterator it=my_vector.begin(); it != my_vector.end(); it++ )
Run Code Online (Sandbox Code Playgroud)

这是真的?如果是,效率提升背后的原因是什么?它所做的全部++/++是将迭代器移动到向量中的下一个项目,不是吗?

c++ iterator stl

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

实现java.lang.Iterator时如何处理异常

java.lang.Iterator接口有3种方法:hasNext,nextremove.为了实现只读迭代器,您必须为其中的两个提供实现:hasNextnext.

我的问题是这些方法没有声明任何异常.因此,如果我在迭代过程中的代码声明异常,我必须将我的迭代代码包含在try/catch块中.

我目前的政策是重新抛出a中的例外情况RuntimeException.但这有问题,因为已检查的异常会丢失,客户端代码不再能明确捕获这些异常.

我如何在Iterator类中解决这个限制?

为清晰起见,这是一个示例代码:

class MyIterator implements Iterator
{
    @Override
    public boolean hasNext()
    {
        try
        {
            return implementation.testForNext();
        }
        catch ( SomethingBadException e ) 
        {
            throw new RuntimeException(e);
        }
    }

    @Override
    public boolean next()
    {
        try
        {
            return implementation.getNext();
        }

        catch ( SomethingBadException e ) 
        {
            throw new RuntimeException(e);
        }
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

java iterator exception

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

如何在std :: set中选择一个随机元素?

如何选择一个随机元素std::set

我天真地试过这个:

int GetSample(const std::set<int>& s) {
  double r = rand() % s.size();
  return *(s.begin() + r); // compile error
}
Run Code Online (Sandbox Code Playgroud)

但这operator+是不允许的.

c++ iterator set

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

为什么xrange能够在Python中重新开始?

我从大多数pythonic方法中遇到了这个代码,用于计算可迭代的匹配元素

r = xrange(1, 10)
print sum(1 for v in r if v % 2 == 0) # 4
print sum(1 for v in r if v % 3 == 0) # 3
Run Code Online (Sandbox Code Playgroud)

r迭代一次.然后它再次迭代.我想如果一个迭代器被消耗掉,那么它就结束了,它不应该再次迭代.

生成器表达式只能迭代一次:

r = (7 * i for i in xrange(1, 10))
print sum(1 for v in r if v % 2 == 0) # 4
print sum(1 for v in r if v % 3 == 0) # 0
Run Code Online (Sandbox Code Playgroud)

枚举(L):

r = enumerate(mylist) …
Run Code Online (Sandbox Code Playgroud)

python iterator xrange

29
推荐指数
2
解决办法
1497
查看次数

我在Python中的itertools中找不到imap()

我有一个问题,我想用itertools.imap()来解决.但是,在我在IDLE shell中导入itertools并调用itertools.imap()后,IDLE shell告诉我itertools没有属性imap.出了什么问题?

>>> import itertools
>>> dir(itertools)
['__doc__', '__loader__', '__name__', '__package__', '__spec__', '_grouper',     '_tee', '_tee_dataobject', 'accumulate', 'chain', 'combinations', 'combinations_with_replacement', 'compress', 'count', 'cycle', 'dropwhile', 'filterfalse', 'groupby', 'islice', 'permutations', 'product', 'repeat', 'starmap', 'takewhile', 'tee', 'zip_longest']
>>> itertools.imap()
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
itertools.imap()
AttributeError: 'module' object has no attribute 'imap'
Run Code Online (Sandbox Code Playgroud)

python iterator

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

Python:如何同时执行两个"聚合"函数(如sum),从同一个迭代器中提供它们

想象一下,我们有一个迭代器,比方说iter(range(1, 1000)).我们有两种功能,每接受一个迭代器作为唯一的参数,说sum()max().在SQL世界中,我们将其称为聚合函数.

有没有办法在不缓冲迭代器输出的情况下获得两者的结果?

要做到这一点,我们需要暂停和恢复聚合函数执行,以便为它们提供相同的值而不存储它们.也许是否有一种方法可以在没有睡眠的情况下使用异步事物来表达它?

python iterator coroutine async-await

29
推荐指数
2
解决办法
781
查看次数

新的std :: map :: erase()签名C++ 17

根据这个答案,iterator必须可以隐含地转换为const_iterator.insert_or_assign()既然如此,正如我们可以看到的那样,为什么在C++ 17中添加了新的签名std::map::erase()

在C++ 11中,我们有 iterator erase( const_iterator pos );

在C++ 17中,我们现在有了 iterator erase( iterator pos );

是不是C++ 11签名足以接收iteratorconst_iterator

c++ iterator const-iterator c++11 c++17

29
推荐指数
1
解决办法
909
查看次数

标签 统计

iterator ×10

c++ ×6

stl ×4

python ×3

async-await ×1

c++11 ×1

c++17 ×1

const-iterator ×1

coroutine ×1

exception ×1

java ×1

set ×1

xrange ×1