草庐IT

for 与 while 循环中的 C++ 迭代器行为

我不明白为什么使用for循环遍历容器与使用while循环遍历容器产生不同的结果。下面的MWE用一个vector和一组5个整数来说明这一点。#include#include#includeusingnamespacestd;intmain(){vectorv;sets;//addintegers0..5tovectorvandsetsfor(inti=0;i::const_iteratoritv;for(itv=v.begin();itv!=v.end();itv++)cout::const_iteratorits;for(its=s.begin();its!=s.end();its++

c++ - C++ 迭代器是 "safe"吗?

我已经阅读了C++列表迭代器的文档,但无法弄清楚一件事:C++迭代器“安全”吗?我的意思是,它是否会在到达列表中的最后一个现有元素后停止递增?[]的 最佳答案 不,从这个意义上说,它们并不“安全”。可以将迭代器递增到末尾。对于标准库中的所有迭代器,这样做将导致未定义的行为。如果您愿意,您可以定义自己的迭代器,它们确实以安全的方式运行。 关于c++-C++迭代器是"safe"吗?,我们在StackOverflow上找到一个类似的问题: https://stack

c++ - vector 、迭代器和 std::find

有没有办法在不同的vector中使用不同类型的迭代器?或者,是否有一个函数将vector中元素的位置作为整数返回?std::vector::iteratorit;//Iterator//monsterQueueisavectorit=std::find(bot.monsterQueue.begin(),bot.monsterQueue.end(),object);//Checkdowehavetheobjectinthequeueif(it!=bot.monsterQueue.end())//Ifwedohaveit{bot.monsterDists.at(it)=mobDist;//

c++ - 使用反向迭代器在 C++ 中反转字符串?

我有以下代码,但我似乎想不出一种方法来反转字符串:stringstreamconvert;stringy="";stringz="";convert有人可以帮我解决这个问题吗?谢谢! 最佳答案 z.assign(y.rbegin(),y.rend());或者你可以在构建时做:std::stringz(y.rbegin(),y.rend());如果你想就地修改字符串,使用std::reverse:std::reverse(y.begin(),y.end()); 关于c++-使用反向迭代器在

c++ - STL 迭代器 - 目的

STL迭代器的用途是什么?为什么程序员要创造这个概念? 最佳答案 迭代器允许您将算法与容器分开。只要您有开始和结束迭代器,并且知道迭代器的功能(随机访问等),您就可以在迭代器指定的范围内进行操作。例如,参见std::for_each、std::transform。通过这种方式,您可以只实现算法的一个版本,而无需为您希望算法在其上运行的每个容器编写一个新版本。 关于c++-STL迭代器-目的,我们在StackOverflow上找到一个类似的问题: https:/

c++ - 领域特定的 C++ 迭代器方法

除了迭代器概念所需的常规方法之外,是否有任何理由不在迭代器中包含非标准方法?附加方法将特定于迭代器生成的项目类型。具体例子为了使我的问题更具体,我在GUI菜单中对菜单项进行交互。在内部,迭代器通过索引访问菜单。取消引用时,它会查询菜单中的项目,在该索引处创建一个表示菜单返回的属性的不可变对象(immutable对象),并在返回对它的引用之前将其缓存在成员变量中。不安全的解决方案另一种方法是使表示可变,并将属性更新写回底层菜单。它看起来像这样:menum=some_menu();menu_iteratorpos=m.begin()+3;menu_itemi=*pos;...i.capti

c++ - C+ 自定义迭代器?

我一直在尝试为一个简单的类实现一个自定义的前向迭代器。这个类是固定数组的一个非常糟糕的抽象(不幸的是我不能改变它)。只能使用索引访问元素。templatestructdata{staticconstsize_tMAX_BUFFER{50};T*buffer_[MAX_BUFFER]={};intcurrpos_=0;voidinsert(T*value){if(currpos_=currpos_)returnNULL;return&buffer_[i];}~data(){for(inti=0;i{usingreference=typenamestd::iterator::referen

c++ - 移动 vector 会使迭代器无效吗?

如果我有一个指向vectora的迭代器,那么我从a移动构造或移动分配vectorb,该迭代器仍然指向相同的元素(现在在vectorb中)?这是我在代码中的意思:#include#includeintmain(intargc,char*argv[]){std::vector::iteratora_iter;std::vectorb;{std::vectora{1,2,3,4,5};a_iter=a.begin()+2;b=std::move(a);}std::couta_iter是否仍然有效,因为a已被移动到b中,或者迭代器是否因移动而无效?作为引用,std::vector::swapd

c++ - vector 结束迭代器

这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:comparingiteratorsfromdifferentcontainers在实践中,std::vector::iterator可能被实现为一个包装T*在大多数STL实现中,每个迭代器都与一个唯一的内存地址相关联(假设迭代器来自非空vector)。但是,这是一个实现细节。C++标准是否有任何实际保证,即每个vector迭代器在某种程度上都是唯一的?具体来说,可以end()一个非空vector的迭代器永远等于end()另一个非空vector的迭代器?例如:std::vectorv1;std::vector

c++ - 一个 "strong"迭代器指针/引用

是否存在“强”迭代器之类的东西。我的意思是一个迭代器坚持它引用的值而不是它所在的地址,这样如果值被交换到不同的地址,迭代器将继续指向这个新地址中的它;不管它在数据结构中被移动到哪里? 最佳答案 是也不是。但为什么?你想要什么std::iter_swap(strong_a,strong_b);做什么?正如KarolyHorvath指出的那样,您可以实现自己的容器,它有自己的迭代器(迭代器只是一个概念,不是任何一种类型)。至于“实现一个可以很好地与标准库一起工作”的方法,这取决于您想到的是标准库的哪一部分。您不能向容器中添加东西(除非您