DatePeriod是一个用于处理重复日期的PHP类.它的方法数量非常有限.因此,当我想要使用重复日期执行基本数组函数时,我必须将其复制到数组中iterator_to_array.奇怪的是,复制它似乎破坏了它.有什么想法吗?
$p=new DatePeriod(date_create('2008-01-01'),
DateInterval::createFromDateString( "+2 days" ),
date_create('2008-12-31'));
echo count(iterator_to_array($p)); //183
$a=iterator_to_array($p);
echo count($a); //0
Run Code Online (Sandbox Code Playgroud) 我一直在寻找为我自己的容器创建迭代器的示例代码,但我还没有找到一个很好的例子.我知道之前曾经问过这个问题(创建我自己的迭代器)但是没有看到任何令人满意的答案.
我正在寻找简单的示例代码来开始如何设计我自己的迭代器.
谢谢
我想用迭代数替换字符串中的空行
例如,替换
串:
"My first line
My second line
My third line"
Run Code Online (Sandbox Code Playgroud)
同
"
1
My first line
2
My second line
3
My third line"
Run Code Online (Sandbox Code Playgroud)
我可以使用匹配和替换这些行
var newstring = TestVar.replace (/(^|\n\n)/g, "\nhello\n");
Run Code Online (Sandbox Code Playgroud)
但是我正在努力添加一个函数,它会为每个函数添加一个迭代数.
你能帮我吗?
TIA,
导游服务
我想知道为什么GetEnumerator()方法是从IEnumerator中分解出来并放在IEnumerable中的.在我看来,将所有枚举器方法保留在IEnumerator中会更有意义.
谢谢,
斯科特
我使用jquery选择器:
$('#menus>ul>li>a')
Run Code Online (Sandbox Code Playgroud)
我想在没有最后一个的情况下迭代选择器结果:
$('#menus>ul>li>a').removeLast().each(fct());
Run Code Online (Sandbox Code Playgroud)
当然,函数"removeLast()"不存在,是否有相应的?
谢谢.
我有一个函数,其中我有保持的字符串(例如一个容器vector<string>,set<string>,list<string>给定的开始迭代和结束迭代器),并且,经过迭代范围处理所述字符串.
目前该函数声明如下:
template< typename ContainerIter>
void ProcessStrings(ContainerIter begin, ContainerIter end);
Run Code Online (Sandbox Code Playgroud)
现在,这将接受任何符合实现operator*,前缀operator++和函数体中其他调用的隐式接口的类型.
我真正想做的是有一个像下面那样明确限制输入量的定义(伪代码警告):
template< typename Container<string>::iterator>
void ProcessStrings(Container<string>::iterator begin, Container<string>::iterator end);
Run Code Online (Sandbox Code Playgroud)
所以我可以这样使用它:
vector<string> str_vec;
list<string> str_list;
set<SomeOtherClass> so_set;
ProcessStrings(str_vec.begin(), str_vec.end()); // OK
ProcessStrings(str_list.begin(), str_list.end()); //OK
ProcessStrings(so_set.begin(), so_set.end()); // Error
Run Code Online (Sandbox Code Playgroud)
本质上,我想要做的是限制函数规范,使函数的用户明白它接受的内容,如果代码编译失败,他们会得到一条消息,他们使用了错误的参数类型而不是XXX类无法找到XXX函数的函数体.
我发现了类似的主题:
C++(stl)与Java中的迭代器,是否存在概念上的差异?
这基本上处理Java迭代器(类似于C#)无法后退.
所以在这里我想关注限制 - 在C++迭代器中不知道它的限制,你自己将给定的迭代器与限制进行比较.在C#中,迭代器知道更多 - 如果迭代器有效,你可以在不与任何外部引用比较的情况下判断.
我更喜欢C++方式,因为一旦有了迭代器,你可以将任何迭代器设置为限制.换句话说,如果您只想获得少量元素而不是整个集合,则不必更改迭代器(在C++中).对我来说它更"纯粹"(清晰).
但是当然MS在设计C#时知道这个和C++.那么C#方式的优点是什么?哪种方法更强大(这导致基于迭代器的更优雅的功能).我错过了什么?
如果您对C#与C++迭代器设计的想法不同于它们的限制(边界),请同时回答.
注意 :(以防万一)请保持严格的技术讨论.没有C++/C#flamewar.
正如Tzaman所说:"限制单独表达没有任何好处,因为除了一次走一个元素之外没有办法到达那里." 但是,构建一个一次执行几个步骤的C#迭代器并不困难,因此问题是 - 是否有一个显式限制迭代器的好处(如在C++中)?如果是 - 什么?
Edit1:假设你有一个函数foo,它在迭代器上做了一些事情(这个例子很天真!)
void foo(iter_from,iter_end) // C++ style
void foo(iter) // C# style
Run Code Online (Sandbox Code Playgroud)
现在你想在除了最后10个之外的所有元素上调用功能栏.
bar(iter_from,iter_end-10); // C++ style
Run Code Online (Sandbox Code Playgroud)
在C#中(如果我没有记错的话)你必须为这个迭代器提供额外的方法来改变它的限制,如下所示:
bar(iter.ChangeTheLimit(-10));
Run Code Online (Sandbox Code Playgroud)
编辑2:重读你的帖子后,我感觉到了至关重要的区别.在C++中,您处理集合的迭代器,在C#中您处理集合(迭代器在内部使用).如果是的话,我仍然对C#感到有点不舒服 - 你迭代了这个集合,当你找到有趣的元素时,你想要将所有元素从"here"传递到结尾.在C++中,它非常简单,没有开销.在C#中,您要么传递一个迭代器,要么传递一个集合(如果后者会有额外的计算).我等你的评论:-)
我不是在比较苹果和橘子.比较.理论在这里是共同点,所以你有排序算法,分区等.你有收集的概念(或序列,如乔恩喜欢).现在 - 问题是你如何设计对元素的访问,以便用C#或C++(或任何其他语言)编写优雅的算法.我想理解"我们这样做的原因,因为......".
我知道.NET迭代器和集合是单独的类.我知道访问元素和整个集合之间的区别.但是在C++中,处理集合的最常用方法是使用迭代器 - 这样您就可以使用列表和向量,尽管这些集合完全不同.另一方面,在C#中你更愿意写
sort(IEnumerable<T> coll)
Run Code Online (Sandbox Code Playgroud)
功能而不是
sort(IEnumerator<T> iter)
Run Code Online (Sandbox Code Playgroud)
正确?所以在这个意义上我猜你不能把C#迭代器作为C++迭代器,因为C#不像C++那样表达相同的算法.或者正如Jon指出的那样 - 在C#中你更倾向于转换集合(Skip,Take)而不是改变迭代器.
我想将生成器或迭代器转换为递归列表.
我在下面编写了一个代码,但它看起来很幼稚和丑陋,可能会在doctest中删除.
Q1.帮帮我好版本.
Q2.如何指定对象是不可变的?
import itertools
def isiterable(datum):
return hasattr(datum, '__iter__')
def issubscriptable(datum):
return hasattr(datum, "__getitem__")
def eagerlize(obj):
""" Convert generator or iterator to list recursively.
return a eagalized object of given obj.
This works but, whether it return a new object, break given one.
test 1.0 iterator
>>> q = itertools.permutations('AB', 2)
>>> eagerlize(q)
[('A', 'B'), ('B', 'A')]
>>>
test 2.0 generator in list
>>> q = [(2**x for x in range(3))]
>>> eagerlize(q)
[[1, 2, 4]]
>>>
test …Run Code Online (Sandbox Code Playgroud) 我正在尝试转换迭代器类,我必须与stl兼容,以便它可以与stl算法一起使用.在下面的简单(和坦率无用)示例中,应该打印0到5的值,我收到以下错误,
ISO C++禁止递增类型'Iterator(*)()'的指针
和,
从'Iterator(*)()'到'int'的无效转换
我究竟做错了什么?
谢谢.
#include <iterator>
#include <algorithm>
#include <iostream>
class Iterator : public std::iterator<std::bidirectional_iterator_tag, int> {
public:
Iterator(int i = 0) : val(i) {
if(val<0 || val>5) throw;
}
bool operator==(Iterator const& rhs) const {
return (val==rhs.val);
}
bool operator!=(Iterator const& rhs) const {
return !(*this==rhs);
}
Iterator& operator++() {
if(val!=6)
++val;
return *this;
}
Iterator operator++(int) {
Iterator tmp (*this);
++(*this);
return tmp;
}
Iterator& operator--() {
if(val!=-1)
--val;
return *this;
}
Iterator operator--(int) { …Run Code Online (Sandbox Code Playgroud) 这不是一个新问题,我找到了没有任何解决方案的参考文献first和second。我是 PyTorch 的新手,AttributeError: 'Field' object has no attribute 'vocab'在PyTorch使用torchtext.
继本书之后,Deep Learning with PyTorch我编写了与书中解释的相同的示例。
这是片段:
from torchtext import data
from torchtext import datasets
from torchtext.vocab import GloVe
TEXT = data.Field(lower=True, batch_first=True, fix_length=20)
LABEL = data.Field(sequential=False)
train, test = datasets.IMDB.splits(TEXT, LABEL)
print("train.fields:", train.fields)
print()
print(vars(train[0])) # prints the object
TEXT.build_vocab(train, vectors=GloVe(name="6B", dim=300),
max_size=10000, min_freq=10)
# VOCABULARY
# print(TEXT.vocab.freqs) # freq
# print(TEXT.vocab.vectors) # vectors
# print(TEXT.vocab.stoi) # Index
train_iter, test_iter …Run Code Online (Sandbox Code Playgroud) iterator ×10
c++ ×3
c# ×2
python ×2
stl ×2
containers ×1
generator ×1
ienumerable ×1
ienumerator ×1
immutability ×1
javascript ×1
jquery ×1
list ×1
nlp ×1
oop ×1
php ×1
pytorch ×1
recursion ×1
regex ×1
replace ×1
spl ×1
templates ×1
torchtext ×1