标签: iterator

Java Iterator实现 - next()和hasNext()强制执行命令

我有一个实现java.util.Iterator要求next()始终通过调用来进行调用hasNext().(这是因为结果在多线程环境中异步返回,并且永远不清楚可能会有多少结果).

在JavaDoc中正确记录它是否"正确"然后抛出一个RuntimeException如果违反了它.或者这会使Iterator接口拉得太远?

所有的想法赞赏?

java concurrency iterator

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

向量索引访问与迭代器访问的效率

我有问题要通过使用索引访问(使用operator [])或使用迭代器来纠正我对访问向量元素的效率的理解.

我的理解是"迭代器"比"索引访问"更有效.(我认为vector::end()也比效率更高vector::size()).

现在我编写了示例代码测量它(在Windows 7下使用Cygwin,使用g ++ 4.5.3)

索引访问循环版本(以前标记为随机访问):

int main()
{
  std::vector< size_t > vec ( 10000000 );
  size_t value = 0;

  for( size_t x=0; x<10; ++x )
  {
    for ( size_t idx = 0; idx < vec.size(); ++idx )
    {
      value += vec[idx];
    }
    return value;
  }
}
Run Code Online (Sandbox Code Playgroud)

迭代器循环代码是这样的:

    for (std::vector< size_t >::iterator iter = vec.begin(); iter != vec.end(); ++iter) {
        value = *iter;
    }
Run Code Online (Sandbox Code Playgroud)

我很惊讶地看到"索引访问"版本更快.我用time命令"测量".数字是:

结果使用g++ source.cpp (无优化)索引访问

真正的800ms

迭代器访问

真正的2200ms …

c++ iterator stl vector

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

Vaadin - 迭代布局中的组件

我正在研究Vaadin 7中的一个项目.我需要解析Layout中的所有组件并找到我需要的组件.

在此输入图像描述

以上是我的布局的图形表示.

我正在蓝色垂直布局中动态创建绿色垂直布局.由于我是动态创建的,因此我不能为这些动态创建的东西提供任何实例.但是,我对所有组件都有唯一的ID.

现在我需要使用Id找到一个Combobox.我不知道如何从蓝色垂直布局解析组合框.

我只有蓝色垂直布局的实例和组合框的Id.并且,如果需要,我也可以使用绿色和红色布局的ID.

我需要这样的东西,但卡住..

Iterator<Component> iterate = blueMainLayout.iterator();
Combobox cb;
while (iterate.hasNext()) {
Component c = (Component) iterate.next();
cb = (Combobox) blueMainLayout.....;
        if (cb.getId().equals(something.getId())) {
            // do my job
        }
    }
Run Code Online (Sandbox Code Playgroud)

layout components iterator dynamic vaadin

8
推荐指数
1
解决办法
9489
查看次数

迭代正在改变的std :: list的有效方法?

我正在尝试迭代std::list但是有一个问题 - 在迭代期间执行的操作可能最终添加或从列表中删除元素.在这种情况下,添加不是问题,但删除可能最终使列表中的任何迭代器无效,包括序列中的当前或下一项.

决定修改列表的点远离迭代循环 - 调试器在两者之​​间的调用堆栈中显示40个函数调用.因此,无法根据删除修改迭代器.

我唯一能想到的是在开始时复制列表并迭代它,测试每个元素以确保它仍然在主列表中.这是一个O(n ^ 2)命题,如果可能的话,我想避免.

c++ iterator list

8
推荐指数
1
解决办法
377
查看次数

如何跳过`for`循环中的第一个元素?

在python中有一个强大的通用方法来跳过for循环中的第一个元素吗?

我能想到的唯一方法是手工编写一个特殊的发电机:

def skipFirst( it ):
    it = iter(it) #identity for iterators
    it.next()
    for x in it:
        yield x
Run Code Online (Sandbox Code Playgroud)

并使用它例如:

for x in skipFirst(anIterable):
    print repr(x)
Run Code Online (Sandbox Code Playgroud)

并喜欢:

doStuff( str(x) for x in skipFirst(anIterable) )
Run Code Online (Sandbox Code Playgroud)

并喜欢:

[ x for x in skipFirst(anIterable) if x is not None ]
Run Code Online (Sandbox Code Playgroud)

我知道我们可以在列表上做切片,(x for x in aList[1:])但这会产生一个副本,并不适用于所有序列,迭代器,集合等.

python iterator for-loop

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

为什么在C#中基于模式的编程

想知道为什么C#正朝着更多基于模式的编程而不是传统方式发展.

防爆.该foreach声明预计,循环源已经被称为魔术方法GetEnumerator,它返回它有几个魔术方法类似于对象MoveNextCurrent,但他们并没有强制任何特定的接口?C#可以强制要求使用的类foreach应该实现,IEnumerable或者IEnumerable<T>using语句执行,因为它期望在using语句中使用对象来实现IDisposable接口.

此外,我看到async/ await关键字也有类似的趋势....

当然必须有一个很好的理由,但是我理解编译器/ CLR需要"魔术方法"而不是依赖接口的原因似乎有点奇怪.

c# foreach iterator

8
推荐指数
1
解决办法
378
查看次数

PHP 生成器返回类型

我以前从未在 PHP 中使用过生成器,文档中也没有显示返回类型声明的示例。

在 PhpStorm 中,执行此操作时 IDE 中出现错误:

public function getDataIncrementally(): void {
    yield from [/* some large set of numbers*/];
}
Run Code Online (Sandbox Code Playgroud)

错误是:

生成器只能声明返回类型为 Generator、Iterator 或 Traversable,或可迭代,不允许使用 void。

我可以看到继承树是Traversable-> Iterator-> Generator。同时,iterable是 PHP 7.1 中引入的一种新的伪类型。

iterable如果我只需要支持 PHP >= 7.1 ,是否适合用于返回类型声明?

php iterator iterable generator php-generators

8
推荐指数
1
解决办法
2032
查看次数

const_iterator &lt;T&gt;和iterator &lt;const T&gt;有什么区别?

假设我正在实现一个集合,例如std::vector。我需要实现iteratorconst_iterator,但是一旦完成,iteratorconst_iterator不能仅实现为iterator<const T>T集合中的类型在哪里)?

一定有原因为什么它不起作用,因为有上百万个问题有关如何在实现时重用代码iteratorconst_iterator但是没有一个说“仅const T作为类型使用”。

c++ iterator const const-iterator

8
推荐指数
1
解决办法
465
查看次数

从向量中擦除元素 - rbegin() 与 begin()

我正在尝试解决 C++ 中的一个问题,其中一部分要求我使用rbegin()成员函数从向量中删除元素。但是,每次我编写下面提到的代码时,编译器都会抛出错误。这里有什么问题?

int main() {

    int a = 1, b = 2;

    vector<int> V = {a, b};

    auto it = V.rbegin();
    V.erase(it);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误:

但是,如果我使用begin()成员函数访问相同的元素,它编译得很好。下面的代码工作正常。

int main() {

    int a = 1, b = 2;

    vector<int> V = {a, b};

    auto it = V.begin()+1;
    V.erase(it);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ iterator vector erase reverse-iterator

8
推荐指数
1
解决办法
364
查看次数

为什么不能将两个 std::vector 迭代器相加?

这更像是一个关于 C++ 的好奇问题,是在学习如何查找迭代器引用的索引后提出的。

给定两个向量迭代器,为什么它们可以相减但不能相加?

例如,为什么要编译和运行:

std::vector<int> vect;
vect.begin() - vect.end();
Run Code Online (Sandbox Code Playgroud)

虽然这不会:

std::vector<int> vect;
vect.begin() + vect.end();
Run Code Online (Sandbox Code Playgroud)

问题是更好地了解迭代器的行为方式。对于那些评论和回答的人,谢谢!我需要更多地研究指针算法才能理解这一点。

我认为最有帮助的答案是迭代器就像指针。

减去两个指针来得到它们的距离差是有道理的,就像在数轴上看 1-10 并想要 7 和 3 之间的距离,你从 3 中减去 7 得到 4 的距离。

将 7 和 3 相加得到 10,这并不能帮助我找到它们之间的距离,并且在容器中最终会指向容器边界之外的东西,这没有帮助或有用。

c++ iterator operator-overloading pointer-arithmetic stdvector

8
推荐指数
1
解决办法
192
查看次数