草庐IT

Iterator

全部标签

c++ - std::list 上的 splice() 和迭代器失效

list::splice()的三参数形式将单个元素从一个列表移动到另一个列表。SGI'sdocumentation明确声明所有迭代器,包括指向被移动元素的迭代器仍然有效。Roguewave'sdocumentation没有说明splice()方法的迭代器失效属性,而C++标准明确指出它会使所有迭代器和对被拼接元素的引用失效。splicing()在实践中按照SGI的定义工作,但我在Microsoft的STL实现(严格遵循标准的字母)的调试/安全SCL版本中遇到断言失败(取消引用无效迭代器)。现在,我使用列表正是因为我想在列表之间移动一个元素,同时保持指向它的迭代器的有效性。该标准对原始S

c++ - boost::filter_iterator——我将如何使用 STL 做到这一点?

我收到了一个迭代器,我必须将它传递给另一个函数——但经过过滤以便跳过某些元素(这是一个指针范围,我想过滤掉NULL指针)。我在谷歌上搜索了“STLfilteriterator”以查看如何执行此操作,并且boost::filter_iterator上来了。这看起来不错,我可以使用它,但我也可以使用良好的旧STL来实现吗?当然,无需将元素复制到新容器中。我想我必须创建另一个迭代器类来提供必要的begin()、end()等函数并进行过滤?所以我必须重新实现boostiterator_filter...? 最佳答案 你是对的;您实际上是在自

c++ - 从 lambda 函数构造的 boost::function_output_iterator 不可赋值

考虑以下代码片段:autof=[](intx){std::cout问题是,这样构造的function_output_iterator是不可赋值的,因此不满足Iterator概念,要求类型为CopyAssignable.这不是错误,因为boostFunctionOutputIteratordocumentation清楚says:UnaryFunctionmustbeAssignableandCopyConstructible.lambdafunction的While赋值运算符被删除:ClosureType&operator=(constClosureType&)=delete;所以这个行

c++ - C++ 迭代器的生命周期和有效性是多少?

我计划用C++实现一个事物列表,其中的元素可能会被乱序删除。我不希望我需要任何类型的随机访问(我只需要定期扫描列表),而且项目的顺序也不重要。所以我想到了std::listwiththis->position=insert(lst.end(),thing)应该可以解决问题。我希望Thing类记住每个实例的位置,以便以后可以轻松地执行lst.erase(this->position)在常数时间内。但是,我对C++STL容器还是有点陌生​​,我不知道将迭代器保存这么长时间是否安全。特别是考虑到在插入的Thing消失之前和之后还会有其他元素被删除。 最佳答案

c++ - 为什么范围的算法与 std 的迭代器不兼容?

#include#include#includeintmain(){autocoll=std::vector{1,2,3};ranges::copy(coll,ranges::ostream_iterator{std::cout,","});//okranges::copy(coll,std::ostream_iterator{std::cout,","});//error}上面的代码显示了这个问题。我用ranges-v3-0.3.7.对我来说,通用算法copy不应该关心目标迭代器类型,只要它满足输出迭代器的要求即可。如果是这样,为什么范围的算法与std的迭代器不兼容?

c++ - 我可以在 STL::vector::iterator 上做指针运算吗

目前我使用迭代器来搜索vector并测试其元素。我使用访问元素std::vector::iteratorit;if(*it==0);我能否使用相同的指针算术风格逻辑来测试下一个元素(不改变我的迭代器)?我首先需要看看它是否会将迭代器推出边界if(it!=myvec.end())然后测试当前元素和下一个元素if(*it==1&&*(it+1)==1)这会像我预期的那样使用指针工作吗? 最佳答案 是的,std::vector的迭代器是randomaccessiterators所以你添加/减去整数值以获得其他有效的迭代器。从技术上讲,它可

c++ - 在 erase() 之后保持一个有效的 vector::iterator

编辑:我收到了很多答案,告诉我应该将删除分开到另一个循环中。也许我说得不够清楚,但我在最后一段中表示我想找到除此之外的解决方案。即保持当前的代码结构,但使用一些鲜为人知的C++fu使其工作。好吧,我知道在vector上调用erase()会使元素及其后所有元素的迭代器失效,而erase()会返回一个迭代器到下一个有效的迭代器,但如果删除发生在其他地方怎么办?我有以下情况(简化):警告:不要假设这是完整的代码。下面显示的内容被极度简化以说明我的问题。下面显示的所有类和方法实际上要复杂得多。classChild{Parent*parent;}classParent{vectorchild;}

c++ - unordered_map 中迭代器的效率 (C++)

我似乎找不到这方面的任何信息,所以我求助于stackoverflow。C++中std::tr1::unordered_map的迭代器效率如何?特别是与列表迭代器相比。制作一个包装类是否有意义,该包装类也将所有键保存在列表中以允许高效迭代(我的代码确实对unordered_map中的键使用了大量迭代)。对于那些会推荐boost的人,我不能使用它(无论出于何种原因)。 最佳答案 我没有检查TR1,但N3035(C++0x草案)是这样说的:Allthecategoriesofiteratorsrequireonlythosefunctio

c++ - 在 C++ 的集合中查找方法的时间复杂度是多少?

sets;s.insert(1);s.insert(2);...s.insert(n);我想知道s.find(k)需要多少时间,其中k是1..n中的一个数字?我假设它是log(n)。这是对的吗? 最佳答案 O(logN)搜索单个元素。§23.1.2表69expressionreturnnotecomplexitya.find(k)iterator;returnsaniteratorpointingtoanlogarithmicconst_iteratorelementwiththekeyequivalenttok,forconsta

c++ - 使用 g++ 4.8 时缺少 std::vector::erase() 的 const_iterator 重载

followingexample不会使用g++4.8.2编译:#include#includeusingnamespacestd;intmain(){vectorv{1,2,3};v.erase(v.cbegin());//Compilercomplainsreturn0;}编译器说了以下内容。(它不是很可读,但它提示vector::const_iterator和vector::iterator之间没有已知的转换。)prog.cpp:Infunction‘intmain()’:prog.cpp:8:20:error:nomatchingfunctionforcallto‘std::ve