为什么在接口java.util.Collection上定义了iterator()方法,它已经扩展了java.util.Iterable,它定义了这个方法.
我正在考虑某种向后兼容性或在集合级别上对方法编写一些JavaDoc的机会.
还有其他想法吗?
我有一个数字迭代器,例如一个文件对象:
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)
什么是最好的实施?假设文件很大,我想避免两次阅读.
在关于迭代器的另一个问题之后,我对自定义容器有一些疑问.在我的容器中,iterator是一个子类const_iterator,所以我从非const转换为const"免费".但这是允许的,还是有这样的设置有任何缺点或非工作方案?
在游戏中我有一个玩家列表,让我们这样说:
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)
由于我只希望每对玩家互动一次,我想在外圈的当前玩家之后用玩家开始内循环.所以我想克隆迭代器,但是不能编译.
那么,我该怎么做呢?
我是你们所有人,
我在我的软件中发现了一个奇怪的错误.
在我从一个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的两个实现是否有不同的表现?
我希望有一个没有实现差异的数据结构,是否可能?
可能我必须改变这种操作的数据结构
我有一些代码来迭代(多变量)数值范围:
#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) 请注意:这不是一个重复的问题,因为这个问题规定了所有方法Iterator,而不仅仅是map和flatMap.因此Future.traverse不是一个好的答案.
假设我有这个简单的陈述:
(1 to 100).toSet.subsets.find(f)
Run Code Online (Sandbox Code Playgroud)
它完美地运作.它是懒惰的,不会使用大量内存,只要找到一个元素就会返回.当您想并行化时,问题就开始了.你也许会说,这是斯卡拉,必须有.par或Iterator,但没有.
互联网上提出的解决方案是使用.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)
使用更多的内存.我知道它仍然是O(1),但让我们在这里完美:)
它不是完全可并行化的(根据Amdahl定律).当.grouped消耗下一个百万元素块的迭代器时,除了一个线程之外的所有元素都在等待.如果迭代器消耗昂贵,则这尤其成问题.此外,还需要产生一组新线程来处理新块的开销.
生成更复杂/更长的代码(参见示例).如果Iterator有.nextOption,它会缩短代码,但仍然.
尽管编程我自己的生产者 - 消费者模型(迭代器是生产者,线程是消费者)然后最终减少步骤,还有什么吗?
iterator.remove()与list.remove()迭代器不同的是什么不会抛出异常而list.remove()抛出异常?最后两者都在修改集合大小.
请忽略多线程.我只是谈论for-each循环和迭代器循环.据我所知 - 每个循环仅在内部创建迭代器.
我很迷惑.
请有人解释为什么以下代码不能使用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.
在我看来,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吗?