草庐IT

c++ - 如何将访问者界面适配为迭代器界面?

我想知道是否有一个好的设计模式或成语来实现以下内容:Youhaveanexistingclassthatprovidesonlyavisitorinterface,asfollowsclassVisitor{public:virtual~Visitor(){}virtualvoidvisit(Node*n)=0;};classTree{public:voidaccept(Visitor*v);};Andyouwanttohaveaninterfacethatcanbeusedasfollows,whichshoulditeratethroughthetreeinthesameorder

c++ - std::upper_bound 在 const 成员函数中返回 const 迭代器

这是一个类,其中包含一些struct的boost::circular_buffer。我为包含的circular_buffer中的迭代器创建了一个typedef。我的问题是:当doWork函数被标记为const时,std::upper_bound的返回值与MyIterator类型,因为返回值具有boost::cb_details::const_traits。如果我从函数中删除const关键字,我所有的编译错误都会消失。要明确编译器错误是这样的:error:conversionfrom‘boost::cb_details::iterator::Sample,std::allocator::

c++ - 启用S​​TL迭代器调试的真正作用是什么?

我已经通过定义在应用程序中启用了迭代器调试_HAS_ITERATOR_DEBUGGING=1我原以为这实际上只是检查vector范围,但我感觉它的作用远不止于此。实际上正在执行哪些检查等?顺便说一下,DinkumwareSTL。 最佳答案 迭代器有许多操作会导致未定义的行为,此触发器的目标是激活运行时检查以防止它发生(使用断言)。问题显而易见的操作是使用无效的迭代器,但是这种无效可能是由于多种原因引起的:未初始化的迭代器迭代器到已删除的元素迭代器,该元素的物理位置已更改(vector的重新分配)[begin,end)之外的迭代器该标

c++ - 基于指针的基本随机访问迭代器的代码?

我从未实现过类似STL的迭代器,我试图理解如何基于指针实现一个非常基本的东西。一旦我有了这个类,我就可以修改它来做更复杂的事情。因此,这是第一步,我需要它坚如磐石才能理解如何编写我自己的迭代器(不使用boost)。我写了下面的代码,我知道里面有错误。你能帮我正确设计一个受此启发的随机访问迭代器类吗:templateclassContainer::Iterator:publicstd::iterator{//Lifecycle:public:Iterator():_ptr(nullptr){;}Iterator(Type*rhs):_ptr(rhs){;}Iterator(constIt

c++ - 为什么在隐式共享容器上使用迭代器时必须先复制?

Qt的文档说明如下:Thankstoimplicitsharing,itisveryinexpensiveforafunctiontoreturnacontainerpervalue.TheQtAPIcontainsdozensoffunctionsthatreturnaQListorQStringListpervalue(e.g.,QSplitter::sizes()).IfyouwanttoiterateovertheseusinganSTLiterator,youshouldalwaystakeacopyofthecontaineranditerateoverthecopy.Fo

c++ - 在 C++ 中,为什么我们不能使用 > 和 < 来比较迭代器?

这个问题在这里已经有了答案:Whyis"!="usedwithiteratorsinsteadof"(2个答案)关闭6年前。有人问我这个问题,我真的不知道为什么。如果你有一个指针int*x;您可以将指针与>进行比较和因为它代表内存位置,类似于0x00000x00040x0008等。我知道迭代器和指针是不同的,但它们的行为方式非常相似。例如:vectormyVector;for(inti=1;i::iteratorit=myVector.begin();while(it!=myVector.end())//Whycan'twewriteit为什么我们不能写它在while陈述?我知道这与S

c++ - 使用索引避免迭代器失效,保持干净的界面

我创建了一个MemoryManager类,它基本上是两个指针vector的包装器,它们管理堆分配对象的生命周期。一个vector存储“活着的”对象,另一个存储将在下一次添加的对象MemoryManager::refresh.选择此设计是为了避免在遍历MemoryManager时迭代器失效,将新对象直接添加到MemoryManager::alivevector可以使现有的迭代器无效(如果它的大小增加)。templatestructMemoryManager{std::vector>alive;std::vectortoAdd;T&create(){autor(newT);toAdd.pu

c++ - 将 vector 迭代器转换为指针

有什么方法可以将vector::iterator转换为指针而无需访问vector本身?这仅在vector可用时有效:typedefvectorV;int*to_pointer1(V&v,V::iteratort){returnv.data()+(t-v.begin());}但是如果没有vector如何做到这一点呢?这行不通:int*to_pointer2(V::iteratort){//theobviousapproachdoesn'tworkfortheenditeratorreturn&*t;}事实上,我本以为这是一个非常基本和流行的问题,但由于某种原因我找不到它。

c++ - 为什么将不存在的键应用于 map::find 会在 C++ 中返回具有第一个值映射大小的迭代器?

我有一个类似下面代码片段的用例,在getter返回的映射中使用map::find来查找不存在的键实际上会找到一个迭代器,其第一个值是map(可能),因此不会像预期的那样运行,等于map::end这可能是因为我的map是getter返回的map。并在不将其分配给变量的情况下使用了map。这样getter返回值可能已经被立即销毁了。那么如果我的猜测是正确的呢?为什么它返回map的大小而不是它的结束迭代器?#include#includeclassB{longlongid_;public:B()=default;explicitB(longlong);~B()=default;};B::B(

C++ 字符串迭代器

我试图在一个循环中使用迭代器在字符串上执行if语句,但无法弄清楚如何获取if语句的当前字符:for(std::string::iteratori=buffer.end()-1;i>=buffer.begin();--i){if(!isalpha(*i)&&!isdigit(*i)){if(i!="-"){//obviouslythisiswrongbuffer.erase(i);}}}谁能帮我获取当前字符,这样我就可以做一些额外的if语句? 最佳答案 Ican'tfigureouthowtogetthecurrentcharacte