如何编写IEnumerator<T>需要维护某些状态的自定义实现,并仍然可以使用迭代器块来简化它?我能想到的最好的是这样的:
public class MyEnumerator<T> : IEnumerator<T> {
private IEnumerator<T> _enumerator;
public int Position {get; private set;} // or some other custom properties
public MyEnumerator() {
Position = 0;
_enumerator = MakeEnumerator();
}
private IEnumerator<T> MakeEnumerator() {
// yield return something depending on Position
}
public bool MoveNext() {
bool res = _enumerator.MoveNext();
if (res) Position++;
return res;
}
// delegate Reset and Current to _enumerator as well
}
public class MyCollection<T> : IEnumerable<T> {
IEnumerator<T> IEnumerable<T>.GetEnumerator() {
return …Run Code Online (Sandbox Code Playgroud) 受到Linq的污染,我不愿意放弃它.但是,对于某些事情,我只需要使用C++.
linq作为linq-consumer(即对我而言)的真正优势不在于表达树(操作起来很复杂),而是我可以轻松地混合和匹配各种功能.做的等价物.Where,.Select和.SelectMany, .Skip和.Take和.Concat存在C++ -风格的迭代器?
对于我编写的各种常用代码,这些都非常方便.
我不关心LINQ的细节,这里的关键问题是要能够在更高的层次来表达算法,而不是C++代码看起来像C#3.0.我希望能够表达"结果由每个序列的前n个元素串联形成",然后在需要新序列的地方重用这样的表达式 - 无需手动(并贪婪地)实例化中间体.
我正在使用boost变量来保存一些生成的类型,现在我的代码生成器创建了一个包含类型的头和一个能够保存它们的变体.在初始化时,我想迭代变体中的允许类型,而不是变体目前持有的类型.
我可以用变体做到这一点吗?
从perldoc -f我们读到:
有一个单一的迭代器每个散列,由所有共享
each,keys以及values在程序的函数调用; 它可以通过读取散列中的所有元素或通过评估keys HASH或重置来重置values HASH.
当您离开包含范围的范围时,不会重置迭代器each(),这可能会导致错误:
my %h = map { $_, 1 } qw(1 2 3);
while (my $k = each %h) { print "1: $k\n"; last }
while (my $k = each %h) { print "2: $k\n" }
Run Code Online (Sandbox Code Playgroud)
输出:
1: 1
2: 3
2: 2
Run Code Online (Sandbox Code Playgroud)
这种行为的常见解决方法是什么?它each一般值得使用吗?
我正在最终确定一个列出目录中文件的代码段.我没有问题列出目录中的文件,但由于某种原因,我可以让isDot()方法工作,以确保该文件不是"." 要么 ".." .以下结果导致此错误:
Fatal error: Call to undefined method SplFileInfo::isDot() in ....
Run Code Online (Sandbox Code Playgroud)
在我切换到使用Recursive Iterator之前,我正在使用Directory Iterator,它工作正常.下面的代码有什么问题吗?它应该工作.
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($pathToFolder));
//if there is a subdirectory it makes sure the proper extension is passed
foreach($files as $name => $file){
if (!$file->isDot()) { //this is where it shuts me down
$realfile = str_replace($pathToFolder, "", $file);
$url = getDownloadLink($folderID, $realfile);
$fileArray[] = $url;
}
}
Run Code Online (Sandbox Code Playgroud) 我想通过迭代器重复遍历列表(N次),以便不在列表中实际存储N个副本.有没有内置或优雅的方式来做到这一点,而无需编写自己的发电机?
理想情况下,itertools.cycle(my_list)会有第二个参数来限制它循环的次数...唉,没有这样的运气.
在c ++ STL中,如果我有一个迭代器it到一个向量中v,it - v.begin()保证给我一个向量的索引,那么*it == v[it - v.begin()]?如果是这样,对于所有随机访问迭代器都是如此吗?
unordered_map使用begin(),end()和forward迭代器迭代一个似乎很奇怪.
如果是这样,为什么它也没有rbegin(),rend()和双向迭代器呢?有什么技术原因吗?
我想设置options[Symbol.iterator]属性,以便使用for...of语句迭代我创建的简单对象:
options = {
male: 'John',
female: 'Gina',
rel: 'Love'
};
for(let p of options){
console.log(`Property ${p}`);
};
Run Code Online (Sandbox Code Playgroud)
但是这段代码给了我以下错误:
array.html:72 Uncaught TypeError: options[Symbol.iterator] is not a function
Run Code Online (Sandbox Code Playgroud)
如何在上面的简单对象上设置正确的迭代器函数?
解决了
// define the Iterator for the options object
options[Symbol.iterator] = function(){
// get the properties of the object
let properties = Object.keys(this);
let count = 0;
// set to true when the loop is done
isDone = false;
// define the next method, need for iterator
let …Run Code Online (Sandbox Code Playgroud) 我有一个向量,我正在搜索其中的元素,同时用for-each循环迭代向量.如果我在搜索过程中发现任何无效元素,我想将它们从向量中删除.
基本上,我想做这样的事情:
for (auto el : vec) {
if (el == whatImLookingFor) {
return el;
} else if (isInvalid(el)) {
vec.erase(el);
}
}
Run Code Online (Sandbox Code Playgroud)
我看了一些像这样和这个的其他问题,但都推荐使用std::remove_if.这将迭代整个向量并删除所有无效元素,而不是仅迭代直到找到我正在寻找的元素,并忽略之后的任何元素.
这样做有什么好办法?