我有一个实现java.util.Iterator要求next()始终通过调用来进行调用hasNext().(这是因为结果在多线程环境中异步返回,并且永远不清楚可能会有多少结果).
在JavaDoc中正确记录它是否"正确"然后抛出一个RuntimeException如果违反了它.或者这会使Iterator接口拉得太远?
所有的想法赞赏?
我有问题要通过使用索引访问(使用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 …
我正在研究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) 我正在尝试迭代std::list但是有一个问题 - 在迭代期间执行的操作可能最终添加或从列表中删除元素.在这种情况下,添加不是问题,但删除可能最终使列表中的任何迭代器无效,包括序列中的当前或下一项.
决定修改列表的点远离迭代循环 - 调试器在两者之间的调用堆栈中显示40个函数调用.因此,无法根据删除修改迭代器.
我唯一能想到的是在开始时复制列表并迭代它,测试每个元素以确保它仍然在主列表中.这是一个O(n ^ 2)命题,如果可能的话,我想避免.
在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:])但这会产生一个副本,并不适用于所有序列,迭代器,集合等.
想知道为什么C#正朝着更多基于模式的编程而不是传统方式发展.
防爆.该foreach声明预计,循环源已经被称为魔术方法GetEnumerator,它返回它有几个魔术方法类似于对象MoveNext和Current,但他们并没有强制任何特定的接口?C#可以强制要求使用的类foreach应该实现,IEnumerable或者IEnumerable<T>对using语句执行,因为它期望在using语句中使用对象来实现IDisposable接口.
此外,我看到async/ await关键字也有类似的趋势....
当然必须有一个很好的理由,但是我理解编译器/ CLR需要"魔术方法"而不是依赖接口的原因似乎有点奇怪.
我以前从未在 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 ,是否适合用于返回类型声明?
假设我正在实现一个集合,例如std::vector。我需要实现iterator和const_iterator,但是一旦完成,iterator就const_iterator不能仅实现为iterator<const T>(T集合中的类型在哪里)?
一定有原因为什么它不起作用,因为有上百万个问题有关如何在实现时重用代码iterator,const_iterator但是没有一个说“仅const T作为类型使用”。
我正在尝试解决 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++ 的好奇问题,是在学习如何查找迭代器引用的索引后提出的。
给定两个向量迭代器,为什么它们可以相减但不能相加?
例如,为什么要编译和运行:
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