草庐IT

c++ - vector 迭代器不兼容

我目前正在为C++开发图形库,但现在遇到了一个问题,即在运行时的Debug模式下出现断言错误。我还在SO上查看了其他一些问题,但没有一个问题和答案能让我找到解决方案。在一些论坛上阅读后,我的印象是发生此错误是因为一旦vector内容更改,迭代器就会变得无效。(例如当使用erase()时)但是正如您在我的代码中看到的那样,我没有修改vector,只是迭代。错误在我用//ASSERTION标记的行中。奇怪的是,neighbor_it没有指向(*vertex_it)->neighbors()中的第一个对象,而是指向0xfeeefeee。通过代码调试时,我可以清楚地看到neighbors-ve

c++ - 比较 C++ STL 列表迭代器

我的应用程序中有一个C++STL对象列表,它是在启动时构建的,此后从未更改过;指向同一列表节点的两个独立迭代器是否总是比较相等? 最佳答案 是的。前向迭代器的要求之一是:C++1122.4.5/6:Ifaandbarebothdereferenceable,thena==bifandonlyif*aand*bareboundtothesameobject.标准容器上的所有迭代器(至少)是前向迭代器。 关于c++-比较C++STL列表迭代器,我们在StackOverflow上找到一个类似的

c++ - 自定义双向迭代器的 reverse_iterator 上的 for_each 需要 OutputIterator

我创建了一个简单的不可变双向迭代器:#include#include#include#include#includeclassmy_iterator:publicstd::iterator{intd_val;public:my_iterator():d_val(0){}my_iterator(intval):d_val(val){}my_iteratoroperator--(int){d_val--;returnmy_iterator(d_val+1);}my_iterator&operator--(){d_val--;return*this;}my_iteratoroperator+

c++ - 是否可以将基于范围的 for 循环与迭代器范围一起使用?

考虑std::multimap的用法,其中我得到了一系列迭代器:std::unordered_multimapmymap;auto&range=mymap.equal_range("some_key");for(auto&the_pair:range){}现在,上面的代码无法编译,但我将其用于演示目的。是否可以像这样将基于范围的for循环与一对迭代器一起使用?我不认为这是可能的,所以我想我的问题实际上是关于这个用例在STL中是否有一个适配器类。我可能会自己写一个,但这似乎很常见。更新:如果这不是常见情况,并且STL不为此类用法提供此类代理或适配器,那么需要什么来实现它们?我在想我需要重

c++ - STL 迭代器和 'const'

当我使用迭代器时,我遇到了一个问题,似乎是对const的某种隐式转换。我不太确定哪个代码是相关的(如果我知道我可能不会问这个问题!)所以我会尽力说明我的问题。typedefsetContainer;//notconstvoidLargeObject::someFunction(){//notconstContainer::iteratorit;//notconstfor(it=c.begin();it!=c.end();++it){//assumecisa"Container"(*it).smallObjectFunction();//notaconstfunction}}但是我总是得

c++ - 返回 nullptr 迭代器,如何转换它们

我在解决程序中的问题时遇到了一些问题。所以目前每个block都会返回一个迭代器,但是迭代器取决于两种情况:在block中找到所需的元素:returnresultIter;在block中未找到所需的元素:'returnnullptr`第一种情况很简单也很容易解决,但第二种情况是我遇到麻烦的地方。给定模板参数InIter,如何将nullptr转换为InIter类别?templateInInterfunc(...){InIterres=//returnsitertofoundelementiffoundloop(...)//ifsoatokenwillchangedtosignifyacan

c++ - 是否有用于 C 字符串的标准 C++ 迭代器?

有时我需要使用通用C++迭代器范围接口(interface)[first,last)将C字符串传递给函数。是否有适用于这些情况的标准C++迭代器类,或无需复制字符串或调用strlen()的标准方法?编辑:我知道我可以使用指针作为迭代器,但我必须知道字符串在哪里结束,我需要调用strlen()。编辑2:虽然我不知道这样的迭代器是否标准化,但我当然知道这是可能的。回应讽刺的回答和评论,这是stub(不完整,未经测试):classCStringIterator{public:CStringIterator(char*str=nullptr):ptr(str){}booloperator==(

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++ - 为什么取消引用字符串 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())。当然,

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实际上指