我有一个由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()是可行的方法,但我不确定将前向迭代器与反向迭代器进行比较的最佳方法.
我有以下代码,它执行一些迭代器算术:
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)表达的作品(据我所知)仅适用于随机访问迭代器(像的那些vector和deque).如何检查传递的迭代器满足此要求的代码?
我有一个类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成员变量向量中包含的所有项的好迭代器是什么.
我正在编写一个程序,其中迭代器用于循环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)
这是真的?如果是,效率提升背后的原因是什么?它所做的全部++/++是将迭代器移动到向量中的下一个项目,不是吗?
该java.lang.Iterator接口有3种方法:hasNext,next和remove.为了实现只读迭代器,您必须为其中的两个提供实现:hasNext和next.
我的问题是这些方法没有声明任何异常.因此,如果我在迭代过程中的代码声明异常,我必须将我的迭代代码包含在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) 如何选择一个随机元素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+是不允许的.
我从大多数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) 我有一个问题,我想用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) 想象一下,我们有一个迭代器,比方说iter(range(1, 1000)).我们有两种功能,每接受一个迭代器作为唯一的参数,说sum()和max().在SQL世界中,我们将其称为聚合函数.
有没有办法在不缓冲迭代器输出的情况下获得两者的结果?
要做到这一点,我们需要暂停和恢复聚合函数执行,以便为它们提供相同的值而不存储它们.也许是否有一种方法可以在没有睡眠的情况下使用异步事物来表达它?
根据这个答案,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签名足以接收iterator和const_iterator?