Tag: 迭代器

什么是迭代器的默认值?

对于我正在使用的任何STL容器,如果使用迭代器的默认构造函数声明迭代器(此特定容器types的),迭代器将被初始化为什么? 例如,我有: std::list<void*> address_list; std::list<void*>::iterator iter; 什么将被初始化?

在c ++中返回一个指向vector元素的指针

我有一个全球范围内的myObjectsvector。 我有一个方法,使用std::vector<myObject>::const_iterator来遍历向量,并做一些比较来find一个特定的元素。 一旦我find了所需的元素,我想能够返回一个指针(vector存在于全局范围内)。 如果我返回&iterator ,我是否返回迭代器的地址或迭代器指向的地址? 我是否需要将const_iterator回myObject,然后返回该地址?

检查迭代器是否有效

有什么办法来检查一个迭代器(无论是从vector,列表,双向…)是(仍然)无法引用,即没有失效? 我一直在使用try – catch ,但有没有更直接的方法来做到这一点? 例子:(不起作用) list<int> l; for (i = 1; i<10; i++) { l.push_back(i * 10); } itd = l.begin(); itd++; if (something) { l.erase(itd); } /* now, in other place.. check if itd points to somewhere meaningful */ if (itd != l.end()) { // blablabla }

可迭代对象和数组types提示?

我有很多函数要么为数组提供types提示,要么使用is_array()来检查variables的数组。 现在我开始使用可迭代的对象。 他们实现了Iterator或者IteratorAggregate 。 如果它们通过types提示,或者经过is_array() ,它们会被接受为数组吗? 如果我不得不修改我的代码,是否有一个通用的is_iterable() ,或者我必须做类似于: if ( is_array($var) OR $var instance_of Iterable OR $var instanceof IteratorAggregate ) { … } 还有什么其他的可迭代接口?

自定义容器应该有免费的开始/结束function?

当创build一个自定义的容器类,按照通常的规则(即与STLalgorithm一起工作,使用行为良好的通用代码等)工作时,在C ++ 03中,实现迭代器支持和成员开始/结束函数就足够了。 C ++ 11引入了两个新的概念 – 基于范围的循环和std :: begin / end。 基于范围的for循环理解成员开始/结束函数,所以任何C ++ 03容器都支持基于范围的开箱即用。 对于algorithm推荐的方法(根据Herb Sutter编写的“现代C ++代码”)是使用std :: begin代替成员函数。 然而,在这一点上,我不得不问 – 推荐的方法来调用一个完全合格的begin()函数(即std :: begin(c))或依赖于ADL并调用begin(c)? ADL在这种情况下似乎没用 – 因为如果可能,std :: begin(c)委托给c.begin(),通常的ADL好处似乎不适用。 如果每个人都开始依赖ADL,所有的定制容器都必须在必需的名称空间中实现额外的begin()/ end()自由函数。 然而,有几个消息来源似乎暗示了不合格的开始/结束呼叫是推荐的方式(即https://svn.boost.org/trac/boost/ticket/6357 )。 那么什么是C ++ 11的方式? 容器库作者应该为他们的类编写额外的开始/结束函数,以便在不使用名称空间std的情况下支持非限定的开始/结束调用; 或使用std :: begin;?

是否在foreach(item中的T item)之前是多余的(items!= null)?

我经常遇到如下代码: if ( items != null) { foreach(T item in items) { //… } } 基本上, if条件确保只有在items不为null时才会执行foreach块。 我想知道如果条件是真的需要,或者foreach将处理的情况下,如果items == null 。 我的意思是,我可以简单写一下吗? foreach(T item in items) { //… } 而不用担心items是否为空? if条件是多余的? 或者这取决于items的types ,或者也可能在T ?

产生一个recursion函数

我正在尝试对给定path下的所有文件进行操作。 我不想事先收集所有的文件名,然后用它们做一些事情,所以我试着这样做: import os import stat def explore(p): s = '' list = os.listdir(p) for a in list: path = p + '/' + a stat_info = os.lstat(path ) if stat.S_ISDIR(stat_info.st_mode): explore(path) else: yield path if __name__ == "__main__": for x in explore('.'): print '–>', x 但是这个代码跳过目录时,而不是让他们的内容。 我究竟做错了什么?

为什么Java不允许对迭代器进行foreach(仅在iterables上)?

可能重复: 为什么Java的迭代器不是可迭代的? 每个循环给定一个迭代器的习惯用法? 我们可以使用for-each循环来迭代Iteratortypes的对象吗? foreach循环据我所知在Java 5中添加语法糖。所以 Iterable<O> iterable; for(O o : iterable) { // Do something } 将基本上产生与之相同的字节码 Iterable<O> iterable; for(Iterator<O> iter = iterable.iterator(); iter.hasNext(); /* NOOP */) { O o = iter.next(); // Do something } 但是,如果我没有一个迭代器,但只有一个迭代器(比如,因为一个类提供了两个不同的迭代器),我不能使用语法糖foreach循环。 显然我仍然可以做简单的旧式迭代。 不过,我真的想这样做: Iterator<O> iter; for(O o : iter /* Iterator<O>, not Iterable<O>! */) { // Do something […]

我怎样才能实现Iterable接口?

给定以下代码,我如何迭代types为ProfileCollection的对象? public class ProfileCollection implements Iterable { private ArrayList<Profile> m_Profiles; public Iterator<Profile> iterator() { Iterator<Profile> iprof = m_Profiles.iterator(); return iprof; } … public Profile GetActiveProfile() { return (Profile)m_Profiles.get(m_ActiveProfile); } } public static void main(String[] args) { m_PC = new ProfileCollection("profiles.xml"); // properly outputs a profile: System.out.println(m_PC.GetActiveProfile()); // not actually outputting any profiles: for(Iterator i = […]

有Python的“枚举”function的Java等价物吗?

在Python中, enumerate函数允许您迭代(索引,值)对的序列。 例如: >>> numbers = ["zero", "one", "two"] >>> for i, s in enumerate(numbers): … print i, s … 0 zero 1 one 2 two 有什么办法在Java中这样做?