Tag: 迭代器

为什么迭代List会比通过它索引更快?

阅读ADT列表的Java文档,它说: List接口提供了四种位置(索引)访问列表元素的方法。 列表(如Java数组)基于零。 请注意,这些操作的执行时间可能与某些实现(例如LinkedList类)的索引值成比例。 因此,如果调用者不知道实现,遍历列表中的元素通常更适合通过索引。 这到底是什么意思? 我不明白所得出的结论。

创build我自己的迭代器

我试图学习C ++,所以原谅我,如果这个问题表明缺乏基本的知识,你看,事实是,我缺乏基本的知识。 我想了解如何为我创build的类创build迭代器。 我有一个“Shape”类,里面有一个Points的容器。 我有一个“Piece”类,它引用了一个Shape并为Shape定义了一个位置。 Piece没有一个Shape,只是引用一个Shape。 我希望它看起来像Piece是一个点的容器,它与它所引用的形状相同,但增加了Piece位置的偏移量。 我希望能够遍历Piece的点,就像Piece本身就是一个容器一样。 我已经做了一些阅读,没有find任何帮助我的东西。 我会非常感谢任何指针。

为什么在C ++ 11中使用非成员的开始和结束函数?

每个标准容器都有一个用于返回该容器迭代器的begin和end方法。 但是,C ++ 11显然引入了称为std::begin和std::end自由函数,它们调用begin和end成员函数。 所以,而不是写作 auto i = v.begin(); auto e = v.end(); 你会写 using std::begin; using std::end; auto i = begin(v); auto e = end(v); 在他的谈话中, Writing Modern C ++ ,Herb Sutter说,当你想要一个容器的开始或结束迭代器时,你应该总是使用自由函数。 但是,他没有详细说明为什么你想要。 看代码,它可以节省你所有的一个字符。 所以,就标准容器而言,免费function似乎完全没有用处。 Herb Sutter表示,对非标准容器有好处,但他没有详细说明。 所以,问题是std::begin和std::end的自由函数版本究竟做了什么,除了调用相应的成员函数版本之外,为什么要使用它们?

如何在Java中反转列表?

我想在列表上有一个反转的列表视图(类似于List#sublist提供列表中的子列表视图)。 有没有提供这种function的一些function? 我不想做任何列表的副本,也不要修改列表。 在这种情况下,如果在列表中至less可以得到一个反向迭代器就足够了。 另外,我知道如何自己实现这个。 我只是问,Java是否已经提供了这样的东西。 演示实施: static <T> Iterable<T> iterableReverseList(final List<T> l) { return new Iterable<T>() { public Iterator<T> iterator() { return new Iterator<T>() { ListIterator<T> listIter = l.listIterator(l.size()); public boolean hasNext() { return listIter.hasPrevious(); } public T next() { return listIter.previous(); } public void remove() { listIter.remove(); } }; } }; } 我只是发现一些List实现有descendingIterator()这是我所需要的。 […]

将Iterator转换为ArrayList

给定Iterator<Element> ,我们如何以尽可能最快和最快的方式将该迭代器转换为ArrayList<Element> (或List<Element> ),以便我们可以使用ArrayList的操作,比如get(index) add(element)等

C ++ STLvector:从​​索引获取迭代器?

所以,我写了一堆通过index []访问stl向量中的元素的代码,但现在我只需要复制一个向量块。 它看起来像vector.insert(pos, first, last)是我想要的function…除了我只有第一个和最后一个整数。 有没有什么好的方法可以得到这些值的迭代器?

Scalaz迭代:“提升”EnumeratorT与“IterateeT”匹配“更大”的monad

如果我有一个EnumeratorT和一个相应的IterateeT我可以一起运行它们: val en: EnumeratorT[String, Task] = EnumeratorT.enumList(List("a", "b", "c")) val it: IterateeT[String, Task, Int] = IterateeT.length (it &= en).run : Task[Int] 如果枚举器monad比iteratee monad“大”,我可以用up或者更一般地说, Hoist来“提升”迭代器以匹配: val en: EnumeratorT[String, Task] = … val it: IterateeT[String, Id, Int] = … val liftedIt = IterateeT.IterateeTMonadTrans[String].hoist( implicitly[Task |>=| Id]).apply(it) (liftedIt &= en).run: Task[Int] 但是当iteratee monad比枚举器monad“更大”时,我该怎么做? val en: EnumeratorT[String, Id] = […]

用vector :: iterator或at()迭代STLvector的速度会更快吗?

在性能方面,什么工作会更快? 有区别吗? 它是依赖于平台吗? //1. Using vector<string>::iterator: vector<string> vs = GetVector(); for(vector<string>::iterator it = vs.begin(); it != vs.end(); ++it) { *it = "Am I faster?"; } //2. Using size_t index: for(size_t i = 0; i < vs.size(); ++i) { //One option: vs.at(i) = "Am I faster?"; //Another option: vs[i] = "Am I faster?"; }

按降序排列vector

我应该使用 std::sort(numbers.begin(), numbers.end(), std::greater<int>()); 要么 std::sort(numbers.rbegin(), numbers.rend()); // note: reverse iterators 按降序排列vector? 一种方法或另一种方法有什么好处或缺点?

比较来自不同容器的迭代器

比较不同容器的迭代器是否合法? std::vector<int> foo; std::vector<int> bar; expression式foo.begin() == bar.begin()产生错误或未定义的行为? (我正在写一个自定义的迭代器,并且在实现operator==时候偶然发现了这个问题。)