草庐IT

ITERATOR

全部标签

c++ - 编译器无法识别模板函数中的映射迭代器

这个问题在这里已经有了答案:Troublewithdependenttypesintemplates(2个答案)关闭去年。我有以下代码。templateboolhas_key(keychkey,std::mapmap){for(std::map::iteratorit=map.begin();#line13referencedbygccit!=map.end();++it){if(chkey==it->first)returntrue;}returnfalse;}GCC给我以下错误。objects.hpp:Infunction`boolhas_key(key,std::map,std:

C++ : List iterator not incrementable

尝试删除列表的最后一个元素时出现此错误。我调试了代码并且能够找出导致它的原因和位置,这是我的代码:for(Drop_List_t::iteratori=Drop_System.begin();i!=Drop_System.end()&&!Drop_System_Disable;/**/){if(Player->BoundingBox.Intersect(&(*i)->BoundingBox)){i=Drop_System.erase(i);}++i;//Listiteratorcrasheshereiflastentrywasdeleted}我不知道我做错了什么……有什么建议吗?

c++ - 为什么取消引用字符串 vector 迭代器需要括号?

vectorMyStrings;vector::iteratorItStr;我正在使用c_str()返回指向字符串的指针。为什么需要用括号取消引用?不编译:*ItStr.c_str();errorC2039:'c_str':isnotamemberof'std::vector::iterator'编译/使用迭代器周围的括号:(*ItStr).c_str();如果您能给我指出正确的方向(没有双关语意),我将不胜感激。谢谢! 最佳答案 .的优先级高于一元*.*ItStr.c_str()就像您说的是*(ItStr.c_str())。当然,

java - 继承 Java 集合接口(interface)(Set、Map、List 等)的 C++ 等价物是什么?或者扩展 AbstractCollection?

我已经开始使用C++编写代码,来自Java背景(实际上我在我的大学学习了C++,但我们从未接触过STL等)无论如何,我已经到了在各种集合中排列数据的地步,我立即告诉自己“好吧,这是一种集合;这是一个列表,或者一个ArrayList;这是一张map等等。”在Java中,我会简单地让我正在编写的任何类实现Set或Map或List接口(interface);但我可能不会去继承ArrayList或HashSet或其他什么,那里的实现有点涉及,我不想把它们搞砸。现在,我要用C++(使用标准库)做什么?似乎没有Sets、Maps、Lists等的抽象基类——相当于Java接口(interface);

c++ - 迭代器与反向迭代器

我正在使用std::map来存储很多元素(元素对),我有一个“小”疑问。在我的std::map、iterator或reverse_iterator上迭代所有元素哪个更有效? 最佳答案 根据记录,在std::map和std::set容器上取消引用reverse_iterator是比使用iterator慢两倍——在Intel/AMD处理器上同时使用-O3gcc3.4.6和MSVC(在PPC架构上慢近3倍)同样适用于const_reverse_iterator与const_iterator。这是因为reverse_iterator实际上指

c++ - iterator_traits<InIter>::value_type 的创建是否会在传递时触发遵从? (异常测试)

我在故意为不特别遵守迭代器的函数抛出异常(出于测试目的)时遇到了麻烦。要了解我在做什么,请带上我的decorator_iterator结构:structdecorated_iterator:boost::iterator_adaptor,BaseIterator,boost::use_default,IteratorTag>{//....private:friendclassboost::iterator_core_access;/*usedtothrowanexceptionupondereference*/typenamebase_type::referencedereferenc

c++ - 同时迭代两个或多个容器的最佳方法是什么

C++11提供了多种迭代容器的方法。例如:基于范围的循环for(autoc:container)fun(c)std::for_eachfor_each(container.begin(),container.end(),fun)然而,迭代两个(或更多)相同大小的容器以完成如下操作的推荐方法是什么:for(unsignedi=0;i 最佳答案 晚会晚了。但是:我会遍历索引。但不是使用经典的for循环,而是使用基于范围的for循环遍历索引:for(unsignedi:indices(containerA)){containerA[i]=

c++ - 哪些因素使迭代器在 Debug模式下如此缓慢(VC++ 2012)

我有一个包含10000个随机数(mod100)的vector,我想计算其中两个数字之和为100的对数。我写了以下内容:autonoPairsSumTo100=0;constautoitEnd=end(myNums);for(autoit1=begin(myNums);it1!=itEnd;++it1){for(autoit2=it1;it2!=itEnd;++it2){if(*it1+*it2==100){noPairsSumTo100++;}}}在我的机器上,这需要大约21.6秒才能在Debug模式下运行。如果我设置_ITERATOR_DEBUG_LEVEL=0(将_SECURE_S

c++ - 在函数模板中创建容器迭代器

代码是使用GCC编译的。这在VC++中没有任何错误templatevoidFunction(T&A){T::iteratorit;//Error:dependent-name'T::iterator'isparsedasanon-type,//butinstatiationyieldsatype.}Thisarticle声明编译器无法确定T中的迭代器是否存在类型是一个类或只是一个静态成员。所以我们必须使用typename将符号分类为类型的关键字。我的问题是,因为T在编译时已知,那么编译器已经知道iteratorT里面是一个类(在我的例子中T是vector)。那么为什么会出现错误呢?这也

c++ - 如何访问和管理 block 存储的数据

我想做什么我需要以block形式存储单元格数据,即*cell_member1[cell0]..cell_member1[cellN]...cell_memberM[cell0]..cell_memberM[cellN]*然后我需要有效地访问这些数据,如果可能的话,使用一个好的语法。如果我可以定义要轻松存储的数据,那就太好了,即通过定义一个具有成员的对象作为我想要存储的数据,并将它传递给一些为我做所有事情的“魔法”。动机:为什么我需要这样做?缓存垃圾处理。在某些内部循环中,仅访问对象的某些成员。将一半缓存行浪费在未使用的内存上不是我的应用程序的选择。我可以在指向某个顺序内存区域的对象中存