iterator 相关问题

迭代器是一种面向对象的编程模式,允许遍历集合,不知道实际实现或物理内存中的对象地址。它是四人帮的行为设计模式之一。

Javascript:当字符串连接时,新的正则表达式会破坏 for 循环迭代器

我有一个名为 script 的对象。它包含一个名为 name 的变量,其中包含一个字符串。 还有一种数组,包含多个脚本对象,该数组称为脚本。它的大小是5。 ...

回答 1 投票 0

如何计算迭代器适配器链中过滤元素的数量

我有一个应用于初始迭代器的迭代器适配器链(我不知道编译时的数量)。 一个简化的示例是按数字的整除数过滤一系列数字...

回答 1 投票 0

如何实现一个迭代器,其后继取决于项的索引?

我正在尝试实现一个迭代器,它对于常量(在调用时)参数 x 产生序列 x^2、x^2+x、x^2+2x、x^2+3x...在铁锈中。 据我了解,我在任何地点都必须处理...

回答 2 投票 0

C 数组和 C++ 迭代器

我必须对存储为 C 数组的缓冲区进行一些图像处理。 处理必须相对于中心柱对称地进行。 所以我必须处理从中心开始的所有左半部分......

回答 2 投票 0

如何调用 Chipmunk 7 绑定的迭代器 (Nim)

我正在使用chipmunk7库绑定,并尝试调用迭代器eachShape。绑定源在这里 SpaceShapeIteratorFunc* = proc(形状:形状;数据:指针) {.cdecl.} ## 空间/身体

回答 1 投票 0

如何在std::set中选择随机元素?

如何在 std::set 中选择随机元素? 我天真地尝试过这个: int GetSample(const std::set& s) { 双 r = rand() % s.size(); 返回 *(s.begin() + r); // 编译呃...

回答 7 投票 0

为什么 std::distance 会产生负结果?

代码如下: int B[] = {3,5}; int C[] = {4,5}; 计算<< std::distance(B,C); The output is: -4 Can anyone explain why is this?

回答 2 投票 0

如何在迭代时从 std::vector 中删除元素?

我有一个 std::vector m_vPaths;我迭代这个向量并调用 ::DeleteFile(strPath) 。如果我成功删除该文件,我会将其从向量中删除。 我的问题是:...

回答 3 投票 0

foreach 循环如何处理非绑定集合中的更改? c#

众所周知,您不能将 foreach 循环内的集合修改为 InvalidOperationException。 但是 foreach 循环如何检查任何更改呢? 我的意思是,如果我有这段代码: foreach(变量我...

回答 1 投票 0

如何使用自定义步骤迭代范围?

如何使用 1 以外的步骤迭代 Rust 中的某个范围?我有 C++ 背景,所以我想做类似的事情 for(自动 i = 0; i <= n; i+=2) { //... } In Rust I need to ...

回答 5 投票 0

iter() 是如何工作的,它给出“TypeError: iter(v, w): v 必须可调用”

这段代码有什么问题? l = [1,2,3,4,5,6] 对于 iter(l, 4) 中的 val: 打印(值) 它返回 类型错误:iter(v, w):v 必须可调用 为什么 callable(list) 返回 True 而 callabl...

回答 8 投票 0

在 Rust 中组合同一范围内的多个迭代器

我试图理解同一跨度上的 Rust 迭代器如何(以及为什么)无法组合(容易?)。 这是导致问题的代码片段: 让fold_size = 1; 让字段=“12345678\

回答 1 投票 0

迭代器或反向迭代器的一个变量? [重复]

我想在for循环中迭代一些std::向量,但根据某些条件,向量应向前或向后迭代。我想,我可以使用其中任何一个轻松做到这一点

回答 1 投票 0

采访:集合迭代器

大家好,我收到这个面试问题,但遇到了麻烦。我熟悉泛型/集合和迭代器,但是声明集合的方式完全抛出了......

回答 3 投票 0

多态迭代器?

我正在使用 C++ 模板结构 Node 和存储指向这些 Node 对象的指针的复杂集合类 Collection。 Node结构定义如下: 模板 我正在使用 C++ 模板结构 Node 和存储指向这些 Node 对象的指针的复杂集合类 Collection。 Node结构定义如下: template <typename T> struct Node { T data; // Other methods and members }; 集合类是模板化的并保存Node指针: template <typename T> class Collection { Node* root; std::vector<Node*> query(Condition condition); ... }; 我还有一个函数 FoosConsumer 可以处理一系列 Foo 对象: template <typename FooRange> void FoosConsumer(FooRange &foos) { for(Foo &foo : foos) { // Do something with foo } } 当我需要查询我的集合以获取节点本身或仅获取这些节点的数据成员时,就会出现问题。理想情况下,我想直接迭代 collection.query(condition) 返回的节点的数据元素,然后将它们传递给 FoosConsumer。这就是我想要实现的目标: int main() { DataCollection<Foo> collection; // Can iterate over nodes for(auto &node : collection.query(condition)) { ... } // If I need to access `data` I do this: for(auto &node : collection.query(condition)) { Foo &data = node.data; } // My desire: Iterate over `data` of each node directly for(Foo &el : collection.query(condition)) { ... } // The intended use case is: FoosConsumer(collection.query(condition)); } 目前,我正在使用一种感觉低效且麻烦的解决方法: std::vector<Foo*> tmp; for(Node<Foo> &node : collection.query(condition)) { tmp.push_back(&node.data); } FoosConsumer(tmp); 是否有更优雅的方法来直接迭代我的集合中节点的数据成员?我正在寻找一种解决方案,允许对数据属性进行无缝迭代,而不需要中间容器或额外的循环。 我确实可以实现自定义迭代器或代理: for(Node &node : collection.queryNode(condition)) {} for(Data &node : collection.queryFoo(condition)) {} 但是,由于 Node* 和 Data* 共享相同的地址,并且对 Node 大小进行算术运算,我确信有一个技巧。 当我最后实现一个复杂的 tree 结构时,我最终做了类似的事情: namespace impl { enum node_dir {left=0,right=1}; struct node { node* parent; node* child[2]; const node* deep_child_to(node_dir dir) const; const node* next_child_to(node_dir dir) const; const node* parent_with_other_child_to(node_dir dir) const; const node* next_iter_in(node_dir dir) const; //etc. Most tree graph methods here, including mutating }; } 这阻止了每种模板类型生成相同的树维护代码。容器类本身最终变得微不足道,尽管需要一个尴尬的转换: template<class T> class container { struct node : impl::node { std::aligned_storage_t<sizeof(T), alignof(T)> buffer; //details... }; T& data(impl::node* n) {return static_cast<node>(n).buffer;} impl::node root = {}; public: T& first() {return data(root->deep_child_to(impl::left));} void push_back(T& v) {root->push_back(new node(v));} //etc. Almost every method was exactly one line. //note the class NEVER exposes `node` or `impl::node` publicly. } 模板类的方法每个都恰好是一行,这一事实有助于确认实例之间重复的代码最少。 迭代器的工作原理基本相同。他们有一个 node* 并调用 next_iter_in(dir),然后将其投射到 container<node> 以提取 data。有了这些原则,您的 query 方法同样可以在 impl::node 上运行,并且仅在用户边界处转换为 T。 另请注意,使用 node_dir 和 child[2] 允许我使用相同的 C++ 和二进制代码来镜像每个操作。

回答 1 投票 0

尽可能使用“Iterator”代替“Vec”?

当函数采用一系列值作为参数时,接受 Iterator 而不是 Vec 是否被视为良好的风格? 这样,呼叫者可以自行决定如何......

回答 1 投票 0

聚合中的迭代器(linq)?

假设我有一个像这样的小整数数组: {10,20,30} 现在,对于该数组的项目,我想应用以下公式: 10^(数组长度-1) + 20^{数组长度-2) + 30^{数组长度-3} 是

回答 4 投票 0

当转换为迭代器对象时,具有范围的列表文字的内存会发生什么?

我想知道 CODE 2 是否需要 41880+ 的内存空间,因为我“创建”了一个列表......但也许不是因为我没有将它存储在变量中? 换句话说,就是 CODE 1 和 CODE 2

回答 1 投票 0

我可以将 Result 的 Iterator 转换为 Iterator 的 Result 吗?

到目前为止,我已经使用 std::fs::read_to_string 和 String.lines 的 std::str::Lines (这是一个 Iterator)来“逐行”读取文件。这显然读的是

回答 3 投票 0

AbstractList 保证溢出到其他方法中

我想不出更好的问题名称,但我希望一个例子能让这个问题变得更简单。 假设我创建自己的自定义列表(与它的作用无关): 静态类 MyList 我想不出更好的问题名称,但我希望一个例子能让这个问题变得更简单。 假设我创建自己的自定义List(与它的作用无关): static class MyList<E> extends AbstractList<E> { @Override public E get(int index) { return null; } @Override public int size() { return 0; } } 我现在可以创建它的实例并调用与我覆盖的方法不同的方法: MyList<String> myList = new MyList<>(); myList.iterator(); 当然,iterator应该使用我声明的get方法,但这就是保证吗?这是否意味着 iterator 无法以根本不使用 get 的方式进行更改? 举个更简单的例子,你可以考虑addAll。假设我的 MyList 也覆盖了 add: @Override public boolean add(E e) { return super.add(e); // irrelevant what it does } 然后我可以做:myList.addAll(someOtherCollection)。 addAll 可以实现一个简单的: for(E e: someOtherCollection) { // use add that I have overridden } 但与此同时,实现可以改变,并且根本不使用循环(例如ArrayList)。 当然,iterator和addAll在文档中都有一些提及,例如: 此实现返回迭代器接口的简单实现,依赖于后备列表的 size()、get(int) 和 remove(int) 方法。 和 此实现迭代指定的集合,并将迭代器返回的每个对象依次添加到该集合中。 那么这是否意味着这可以不能改变并被视为“规范”?现在我写了这个长问题并重新阅读它,答案可能是明显的“是”。 不,没有这样的保证。这是因为 iterator() 是 Iterable<T> 的一种方法。 可能,也许应该,但不能保证。 您可以查看 ArrayList<T>.addAll() 的实现来了解原因。

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.