标签: iterator

为什么在java.util.Collection上有一个方法iterator()

为什么在接口java.util.Collection上定义了iterator()方法,它已经扩展了java.util.Iterable,它定义了这个方法.

我正在考虑某种向后兼容性或在集合级别上对方法编写一些JavaDoc的机会.

还有其他想法吗?

java collections iterator iterable

15
推荐指数
3
解决办法
658
查看次数

用一次迭代计算均值和方差

我有一个数字迭代器,例如一个文件对象:

f = open("datafile.dat")
Run Code Online (Sandbox Code Playgroud)

现在我想计算:

mean = get_mean(f)
sigma = get_sigma(f, mean)
Run Code Online (Sandbox Code Playgroud)

什么是最好的实施?假设文件很大,我想避免两次阅读.

python iterator

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

可以'iterator'类型只是子类'const_iterator'吗?

关于迭代器的另一个问题之后,我对自定义容器有一些疑问.在我的容器中,iterator是一个子类const_iterator,所以我从非const转换为const"免费".但这是允许的,还是有这样的设置有任何缺点或非工作方案?

c++ containers iterator casting

15
推荐指数
1
解决办法
3402
查看次数

用Java克隆Iterator?

在游戏中我有一个玩家列表,让我们这样说:

LinkedList<String> players = new LinkedList<String>();
Run Code Online (Sandbox Code Playgroud)

我想让每个玩家与其他玩家互动,所以我写了两个嵌套循环:

Iterator<String> i1 = players.iterator();
while (i1.hasNext()) {
    String p1 = i1.next();
    Iterator<String> i2 = players.iterator();
    // But I want to do this: Iterator<String> i2 = i1.clone();
    while (i2.hasNext()) {
        String p2 = i2.next();
        System.out.println("Interact: " + p1 + ", " + p2);
    }
}
Run Code Online (Sandbox Code Playgroud)

由于我只希望每对玩家互动一次,我想在外圈的当前玩家之后用玩家开始内循环.所以我想克隆迭代器,但是不能编译.

那么,我该怎么做呢?

java iterator

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

如何获取std :: set的第一个元素

我是你们所有人,

我在我的软件中发现了一个奇怪的错误.

在我从一个std :: set中删除元素的while循环中,我希望始终采用第一个元素,直到容器为空:

std::set< int*> nodes;
// Fill nodes 
for (int i=0; i<10;i++)
   nodes.insert(new int);
//
while (!nodes.empty())
{
int* pivot  = (*nodes.begin());
// do some operation with pivot erasing some elements from nodes
}
Run Code Online (Sandbox Code Playgroud)

我发现以这种方式实现第一个元素适用于gcc但不适用于MSVC,它会在我尝试取消引用(*nodes.begin())迭代器的地方崩溃.

std :: set的两个实现是否有不同的表现?

我希望有一个没有实现差异的数据结构,是否可能?

可能我必须改变这种操作的数据结构

c++ iterator stl set

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

循环范围更快(C++ 11)

我有一些代码来迭代(多变量)数值范围:

#include <array>
#include <limits>
#include <iostream>
#include <iterator>

template <int N>
class NumericRange : public std::iterator<double, std::input_iterator_tag>
{
public:
  NumericRange() {
    _lower.fill(std::numeric_limits<double>::quiet_NaN());
    _upper.fill(std::numeric_limits<double>::quiet_NaN());
    _delta.fill(std::numeric_limits<double>::quiet_NaN());
  }
  NumericRange(const std::array<double, N> & lower, const std::array<double, N> & upper, const std::array<double, N> & delta):
    _lower(lower), _upper(upper), _delta(delta) {
    _state.fill(std::numeric_limits<double>::quiet_NaN());
  }

  const std::array<double, N> & get_state() const {
    return _state;
  }

  NumericRange<N> begin() const {
    NumericRange<N> result = *this;
    result.start();
    return result;
  }

  NumericRange<N> end() const {
    NumericRange<N> result = *this;
    result._state = _upper; …
Run Code Online (Sandbox Code Playgroud)

c++ optimization iterator c++11

15
推荐指数
1
解决办法
2233
查看次数

并行化Scala的迭代器

请注意:这不是一个重复的问题,因为这个问题规定了所有方法Iterator,而不仅仅是mapflatMap.因此Future.traverse不是一个好的答案.

假设我有这个简单的陈述:

(1 to 100).toSet.subsets.find(f)
Run Code Online (Sandbox Code Playgroud)

它完美地运作.它是懒惰的,不会使用大量内存,只要找到一个元素就会返回.当您想并行化时,问题就开始了.你也许会说,这是斯卡拉,必须有.parIterator,但没有.

互联网上提出的解决方案是使用.grouped,但它不如我想要的那么好.为什么?

val it = (1 to 100).toSet.subsets.grouped(1000000).map(_.par.find(f)).flatten
if (it.hasNext) Some(it.next) else None
Run Code Online (Sandbox Code Playgroud)
  1. 使用更多的内存.我知道它仍然是O(1),但让我们在这里完美:)

  2. 它不是完全可并行化的(根据Amdahl定律).当.grouped消耗下一个百万元素块的迭代器时,除了一个线程之外的所有元素都在等待.如果迭代器消耗昂贵,则这尤其成问题.此外,还需要产生一组新线程来处理新块的开销.

  3. 生成更复杂/更长的代码(参见示例).如果Iterator.nextOption,它会缩短代码,但仍然.

尽管编程我自己的生产者 - 消费者模型(迭代器是生产者,线程是消费者)然后最终减少步骤,还有什么吗?

parallel-processing iterator scala scala-collections

15
推荐指数
1
解决办法
2215
查看次数

为什么iterator.remove不会抛出ConcurrentModificationException

iterator.remove()list.remove()迭代器不同的是什么不会抛出异常而list.remove()抛出异常?最后两者都在修改集合大小.

请忽略多线程.我只是谈论for-each循环和迭代器循环.据我所知 - 每个循环仅在内部创建迭代器.

我很迷惑.

java collections foreach iterator

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

与const std :: string的向量相关的编译失败

请有人解释为什么以下代码不能使用clang 3.5进行编译.

报告的错误是"算法中没有可行的重载"="."

std::vector<const std::string> m_messages;
std::vector<const std::string>::iterator iter;
...

if (iter != m_messages.end())
{
    m_messages.erase(iter);      // compilation error
}
Run Code Online (Sandbox Code Playgroud)

如果我声明m_messages为:std::vector<std::string> m_messages;那么它编译好了.

另外,有什么区别:

std::vector<const std::string> m_messages;
Run Code Online (Sandbox Code Playgroud)

std::vector<std::string> m_messages;
Run Code Online (Sandbox Code Playgroud)

TIA.

c++ iterator stdvector c++11

15
推荐指数
2
解决办法
1095
查看次数

为什么我要使用itertools.islice而不是正常的列表切片?

在我看来,itertools模块中的许多功能都具有更容易的等价物.例如,据我所知,itertools.islice(range(10),2,5)做同样的事情range(10)[2:5],itertools.chain([1,2,3],[4,5,6])做同样的事情[1,2,3]+[4,5,6].主要文档页面提到了速度优势,但除此之外还有任何理由选择itertools吗?

python iterator list

15
推荐指数
2
解决办法
9152
查看次数