迭代器是一种面向对象的编程模式,允许遍历集合,不知道实际实现或物理内存中的对象地址。它是四人帮的行为设计模式之一。
这是可行的,因为 Iterator 实现了 rev(),其中 self 是 DoubleEndedIterator: 让 vec: Vec = Vec::new(); for x in vec.iter().rev() { //做东西 } 但是,如果我改变 vec.iter(...
如何二分搜索 std::vector 但返回 RandomAccessIterator?
我正在寻找一种 log2(N) 方式来搜索 std::vector 并接收 RandomAccessIterator。我希望它完全像 std::lower_bound() 一样工作,但返回 RandomAccessIterator 而不是 ForwardIt...
如何在不递增(递减)迭代器的情况下获取 std::list 中的下一个(上一个)元素?
假设我有一个 std::list lst 和一些 std::list::iterator 用于迭代列表。并取决于 it 的值,我想在我的代码中使用 it + 1 或 it - 1 。有没有...
我正在寻找为什么将常规迭代器转换为支持将项目推回其中的迭代器。 例如。 项目 = 下一个(my_iterator) 如果去了太远(项目): my_iterator.pushback(项目) 布雷亚...
当迭代器取消引用包装类(即右值)时,允许 STL 算法进行交换
我正在为具有“向量的向量”容器的 C 库实现一个 C++ 包装器。在 C++ 接口中,我希望迭代器不取消对原始 C 指针的引用,而是取消对转换的引用...
IEnumerator<T>.当前超出 MoveNext() == false
我的图形库中有以下代码: 而(真){ 使用 (var i = ancestry.GetAdjacent(current).GetEnumerator()) { if (!i.MoveNext()) 产量突破; 我...
是否可以从迭代器类型中检测容器类型? 例如, #包括 int main(){ static_assert(std::is_same< container_of 是否可以从迭代器类型中检测容器类型? 例如, #include<traits> int main(){ static_assert(std::is_same< container_of<std::vector<double>::iterator>::type, std::vector<double>>{}); static_assert(std::is_same< container_of<std::list<int>::iterator>::type, std::list<int>>{}); } (当然,某些迭代器类型不会提供容器(或不会提供唯一的容器),例如原始指针或流迭代器,但在这些情况下,它可能会软SFINAE失败。) 第一次尝试是 template<class T, template<class> class Cont> Cont<T> aux(typename Cont<T>::iterator it); template<class Iterator> struct container_of{ using type = decltype(aux(Iterator{})); }; 但是,它不起作用,因为编译器无法检测到 T 的类型(它不在可扣除的上下文中)。 动机:我想检测迭代器的关联容器是否有 .data() 成员。 不要让你的基元成为迭代器,而让你的基元成为一个范围。 template<class It, bool Contiguous, class D=void> struct range_t { using Self = std::conditional< !std::is_same<D, void>, D, range_t >; It b, e; It begin() const { return b; } It end() const { return e; } Self without_front( std::size_t i = 1 ) const { return {std::next(begin(), i), end()}; } Self without_back( std::size_t i = 1 ) const { return {begin(), std::prev(end(), i)}; } bool empty() const { return begin()==end(); } std::size_t size() const { return std::distance( begin(), end() ); } }; template<class It> struct range_t<It, true, void>: range_t<It, false, range_t<It, true>> { using Base = range_t<It, false, range_t<It, true>>; range_t( It b, It e ):Base(b,e) {} auto* data() const { if (empty()) return nullptr; return std::addressof(*this->begin()); } } }; (手动)跟踪哪些容器是连续的: template<class T, class=void> struct is_contiguous_container : std::false_type{}; template<class T> struct is_contiguous_container<T const, void> : is_contiguous_container<T> {}; template<class T> struct is_contiguous_container<T volatile, void> : is_contiguous_container<T> {}; template<class T> struct is_contiguous_container<T const volatile, void> : is_contiguous_container<T> {}; template<class T> struct is_contiguous_container<T, std::enable_if_t< has_data_ptr<T>{} >>: std::true_type{}; template<class T, std::size_t N> struct is_contiguous_container<T[N],void> : std::true_type{}; 连续的容器是数组、std::array和std::vector,所以不需要跟踪太多。 range_t< ?, true, ? > 也是连续的。 只要写 has_data_ptr,当且仅当 T.data() 返回一个指向非 void 的指针时,这是正确的。 template<class C> auto range( C&& c ) { using std:begin; using std::end; auto b = begin(c), e = end(c); using It = decltype(b); using R = range_t<It, is_contiguous_container<std::remove_reference_t<C>>{}>; return R{ b, e }; } range 现在可以智能地将容器转换为 range_t,并跟踪它是否连续。 range_t支持r.without_front( r.size()/2 )分而治之。 当范围是连续的时,只需对其调用 .data() 即可。 如果不是,请不要。 在您的应用程序中,如果您只想知道容器是否有 .data() 成员,检查它是否是随机访问可能就足够了(使用 std::iterator_traits<Iter>::iterator_category())。 否则,我认为您可能可以结合使用以下技术:如何检查两种类型是否来自同一模板化类以及每个标准容器类型的部分专业化。 或者等待c++17,它有一个新的连续迭代器概念:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4284.html 我现在正在做的是手动注册所有(实际上是一些)连续的迭代器。 由于我总是需要结合某种方法来提取原始指针,因此我直接编写了一个名为 data 的函数来返回指针。 代码并不有趣,它考虑了std::vector<>::iterator,std::basric_string<>::iterator,为了说明(以表明它总是不完整的)我还添加了boost::static_vector<>,原始指针和任何可转换为指针的东西。 (boost::array<>::iterator、std::array<>::iterator和begin/end(std::valarray)被有效地包含在内,因为迭代器是指针)。 我还必须包括 const_iterator 案例。 #include<type_traits> #include<vector> // the code below needs to know about std::vector #include<boost/container/static_vector.hpp> // ... and all possible contigous containers :( template< class ContiguousIterator, // well ProbablyContiguos typename = std::enable_if_t< /**/std::is_same<ContiguousIterator, typename std::vector<std::decay_t<decltype(*std::declval<ContiguousIterator>())>>::iterator>{} or std::is_same<ContiguousIterator, typename std::vector<std::decay_t<decltype(*std::declval<ContiguousIterator>())>>::const_iterator>{} or std::is_same<ContiguousIterator, typename std::basic_string<std::decay_t<decltype(*std::declval<ContiguousIterator>())>>::iterator>{} or std::is_same<ContiguousIterator, typename boost::container::static_vector<std::decay_t<decltype(*std::declval<ContiguousIterator>())>, 1>::iterator>{} or std::is_same<ContiguousIterator, typename boost::container::static_vector<std::decay_t<decltype(*std::declval<ContiguousIterator>())>, 1>::const_iterator>{} // many many other possible iterators :( or std::is_pointer<ContiguousIterator>{} or std::is_constructible<typename std::iterator_traits<ContiguousIterator>::pointer, ContiguousIterator>{} > > typename std::iterator_traits<ContiguousIterator>::pointer data(ContiguousIterator const& it){return std::addressof(*it);} int main(){ std::vector<double> v(30); v[0] = 10.; assert( *data(v.begin()) == 10. ); } 欢迎反馈。
Rust 迭代器映射回调问题“函数预计采用 1 个参数,但它采用 3 个参数,预期函数采用 1 个参数”
这个“do_work”函数需要插入3个参数,但只有第一个参数起作用。请查看图片。 我还需要插入 i2 和 i3 变量。 Rust 地图回调问题 - “func...
back_insert_iterator 在容器的生命周期内有效吗?
我想我知道这个问题的答案,但我希望进行健全性检查。 迭代器失效是否适用于 std::back_insert_iterators? #包括 #包括 #包括<
我正在编写不同的排序函数,它需要两个迭代器和排序序列。我想为任何类型的向量实现它们并使其类型安全,如下所示: 模板
抱歉标题太长...请让我知道如何让它变得更好... 我有一个模板类: 模板 类示例{ ... 模板 沃伊...
检查模板参数是否为 std::vector<T>::iterator
如何检查模板参数是否是 std::vector::iterator? 对于 void 类型,我们有 std::is_void。 std::vector::iterator 有类似的东西吗?
我有一个自定义迭代器接口 公共接口 ThrowingIterator { // 匹配标准 Iterator 的接口,但 next() 和 hasNext() 可以抛出 E } 和一个
给定Iterator,我们如何方便地将Iterator转换为List,以便我们可以对其使用List的操作,例如get(index)、add(element)等
我想用 Java 实现一个迭代器,其行为有点类似于以下 Python 中的生成器函数: def 迭代器(数组): 对于数组中的 x: 如果 x!= 无: 对于 x 中的 y: ...
我有这样的代码: 让事物 = vec![/* ...*/]; // 例如向量 事物 .map(|事物| { 让 a = 尝试!(do_stuff(thing)); 好的(其他_东西(a)) }) .filter(|thing_...
Rust 迭代器方法skip_while 在第一次失败的测试后停止跳过元素(始终返回元素)。如何继续跳过(即不“关闭”跳过)? Rust 迭代器
TypeError:newCollection[Symbol.iterator] 不是 Angular 17 的函数@
@for(段落的段落;跟踪段落){ {{段落}} ... 这是我的代码,错误发生在@for行 <div> <ul> @for (paragraph of paragraphs; track paragraph) { <li>{{ paragraph }}</li> } @empty { <li>No items found</li> } </ul> </div> 这是我的服务 paragraphs = {} as string[]; onInputUrlReturnParagraph(url: string) { this.helloService.getPragraphsFromScraper(url).subscribe( (paragraphs) => { this.paragraphs = paragraphs.split(" {Joined Point} "); } ) } 这是我遇到的错误 TypeError: newCollection[Symbol.iterator] is not a function at reconcile (core.mjs:22571:68) at Module.ɵɵrepeater (core.mjs:22933:9) at HelloComponent_Template (hello.component.html:34:17) at executeTemplate (core.mjs:11268:9) at refreshView (core.mjs:12791:13) at detectChangesInView$1 (core.mjs:13015:9) at detectChangesInViewIfAttached (core.mjs:12978:5) at detectChangesInComponent (core.mjs:12967:5) at detectChangesInChildComponents (core.mjs:13028:9) at refreshView (core.mjs:12841:13) 有人面临这个问题吗?谢谢! paragraphs 应该是一个数组,而不是 {}。 getPragraphsFromScraper() 是异步的,因此 paragraphs 将在 observable 发送新值之前被评估。
计数的时候好像消耗了一个迭代器。如何使用相同的迭代器进行计数然后对其进行迭代? 我正在尝试计算文件中的行数,然后打印它们。我能够...
来自 Iterators.product 的 DataFrame
在 Julia 中,我想从一组数字中创建一个 DataFrame,列出 k 个此类数字的所有组合以及每个此类组合的某些函数,例如它们的总和。例如...