今天我遇到了this问题并开始怀疑gcc/clang和VisualStudio之间的不一致。这个问题本身很笼统,但我仍然想了解-标准是否对迭代器类型是否应该包含任何容器特定类型信息强加了任何规则。考虑这个片段:#include#includestructhash1{size_toperator()(intkey)const{returnkey;}};structhash2{size_toperator()(intkey)const{returnkey+1;}};intmain(intargc,char**argv){std::unordered_mapmap1;map1[1]=1;st
我是C++的新手,我试图在传递if语句的同时遍历映射。但是程序崩溃了。请帮我修复程序。#include#include#include#include#includeusingnamespacestd;intmain(){std::maph;std::map::iteratorit;h[1]=2;h[4]=5;for(it=h.begin();it!=h.end();it++){if(it->second>4){h.erase(it->first);}} 最佳答案 您正在删除for循环内的元素,指向已删除元素(即it)的迭代器将失效
其他迭代器类型肯定不暗示它们指向连续数据,但我想知道我是否可以将RandomAccessIterators视为指向连续数据缓冲区——即它们可以转换为指针数据。这个假设是否正确?如果&*it是一个RandomAccessIterator,我能否始终安全地使用&*it并获得一个指针,不仅指向一个元素,而且指向一个连续的缓冲区? 最佳答案 不,这不是一个有效的假设。标准库本身在std::deque中有一个反例:fromcppreference:Asopposedtostd::vector,theelementsofadequearenot
所以我想将我的set中所有元素的两倍插入回set中。但显然我需要获取结束迭代器,这样我就不会一直迭代新元素。(别担心,我检查过,set::insert不会使迭代器无效:http://www.cplusplus.com/reference/set/set/insert/#validity)所以给定输入setfoo={1,2,3},这就是我所做的:for(autoit=begin(foo),finish=end(foo);it!=finish;++it){foo.insert(*it*2);}我希望我的集合包含:1,2,3,4,6惊喜!它包含:-2147483648,-1073741824
我不明白这段代码中发生了什么。映射引用声明“如果容器为空,则返回的迭代器值不应被取消引用。”但是some_map->begin()->second呢?在一张空map上。我认为它是无效的,但这段代码打印出“0”。谁能解释为什么?intmain(){mapa;printf("%d",a.begin()->second);return1;}谢谢! 最佳答案 来自thisstd::map::beginreferenceIfthecontainerisempty,thereturnediteratorwillbeequaltoend()然后查
请参阅有关尾后迭代器失效的相关问题:this,this.这更多是一个设计问题,即是否存在(在STL或其他地方)past-the-end迭代器“重新验证”这样的概念?我的意思和用例:假设算法需要“跟踪”容器(例如队列)。它遍历容器直到到达end(),然后暂停;独立于此,程序的另一部分将更多项目放入队列中。算法如何在保持之前的尾端迭代器(称之为tailIt)的同时,有效地告诉“有更多的项目被排队”?(这意味着它能够检查tailIt==container.end()still,并且如果那是假的,则得出结论tailIt是现在有效并指向插入的第一个元素)。请不要将问题视为“不,没有”——我正在寻
当我想在C++中遍历一个map时,我们可以使用以下技术:for(autoi=m.begin();i!=m.end();i++){......}为什么我们不能用下面的代替:for(autoi=m.begin();i我的猜测是因为关联容器中的元素不像顺序容器那样按顺序存储,对吗? 最佳答案 比较运算符需要randomaccessiterators.map只提供双向迭代器。原因是如果另一个迭代器在恒定时间内之前或之后,您不能只用这样的迭代器来判断(是的,它们在内存中不是一个接一个)。作为!=对所有类型的迭代器都有效,用它代替版本。如果您更
当C++标准说迭代器不是“无效的”时,这仅仅是指取消引用的能力,还是也暗示了遍历能力?例如,如果swap/insert/etc.一个容器保证不会使任何迭代器失效,这个事实单独是否意味着它也保证推进一个旧的迭代器也是有效的?如果是这样,是否保证它会按照与新迭代器相同的顺序遍历元素?(我在这里问的是传统/“遗留”迭代器,尽管如果新样式有任何差异,那么提及这一点当然也会有所帮助。) 最佳答案 "WhentheC++standardsaysthataniteratorisnot"invalidated",isthatmerelyreferr
在遍历整个string的循环中,我如何查看迭代器的下一个值?for(string::iteratorit=inp.begin();it!=inp.end();++it){//Justpeekatthenextvalueofit,withoutactuallyincrementingtheiterator}这在C中非常简单,for(i=0;i在C++中有什么有效的方法可以做到以上几点?注意:我没有使用Boost。 最佳答案 if(notimp.empty()){for(string::iteratorit=inp.begin();it
我编写了一个包装迭代器并按需返回转换后值的类://iterator-wrapper.htemplateclassIteratorWrapper{Itercur_;constIterlast_;constFctfct_;public:IteratorWrapper(Iterfirst,Iterlast,constFctfct):cur_(first),last_(last),fct_(fct){}constValValue()const{returnfct_(*cur_);}voidNext(){++cur_;}boolDone()const{returncur_==last_;}};现