草庐IT

c++ - 从返回迭代器的 const 和非常量方法中删除代码重复

我正在考虑thisquestion关于const和非常量类方法。首选答案取自ScottMeyers的EffectiveC++,其中非常量方法是根据const方法实现的。进一步扩展,如果方法返回迭代器而不是引用,如何减少代码重复?修改链接问题中的示例:classX{std::vectorvecZ;public:std::vector::iteratorZ(size_tindex){//...}std::vector::const_iteratorZ(size_tindex)const{//...}};我无法根据const方法实现非常量方法,因为如果不使用distance()/advanc

C++ deque 的迭代器在 push_front() 之后失效

刚才,我正在阅读Josuttis的STL书。据我所知——c++vector是一个可以重新分配的c数组。所以,我明白了,为什么在push_back()之后所有的迭代器和引用都会变得无效。但我的问题是关于std::deque。据我所知,它是大块数组(c数组的c数组)。所以push_front()在开头插入元素,如果没有空间,deque分配新block,并将元素放在已分配block的末尾。在中间的insert()之后,所有引用和迭代器都变得无效,我明白为什么——所有元素都被移动了。但我真的误解了短语“...在push_back()和push_front()之后所有引用都保持有效,但迭代器不有

c++ - 使用常规迭代器向后迭代,还是与 reverse_iterator 斗争?

我最近了解了在C++中使用反向迭代器的正确方法(特别是当您需要删除一个时)。(参见thisquestion和thisone。)你应该这样做:typedefstd::vectorIV;for(IV::reverse_iteratorrit=iv.rbegin(),rend=iv.rend();rit!=rend;++rit){//Use'rit'ifareverse_iteratorisgoodenough,e.g.,*rit+=10;//Use(rit+1).base()ifyouneedaregulariteratore.g.,iv.erase((rit+1).base());}但我

c++ - 为成对容器的第一个元素提供迭代器

我有一个装满成对的容器。我想使用STL通用算法对其进行迭代(在我的例子中它将是inner_product,但将其视为通用问题)。我使用的算法首先和最后需要迭代器。我可以提供特殊的迭代器first和last而不是在对上而是在每对的第一个元素上迭代吗?我知道我可以手动完成它,提供一个手工制作的函数对象,它将作为标准容器迭代器的包装器,将其引用到该对本身的第一个成员,但我认为还有一个聪明的单线为我做这件事。会是什么? 最佳答案 我环顾四周,找到了boost::transform_iterator。我想出了这段代码。令人惊讶的是它的效果如何

c++ - 如何实现 std::advance 以更改迭代器类型的行为?

我们对std::advance的了解如下:templatevoidadvance(InputIterator&i,Distancen);目的将迭代器i推进n个元素。如果i是一个随机访问迭代器,函数使用一次operator+或operator-,否则函数重复使用递增或递减运算符(operator++或operator--)直到n个元素被递增。我的问题如下:std::advance是如何实现的,以便识别it是否是随机访问迭代器?它怎么知道它可以使用operator+而不是operator++? 最佳答案 通过iterator_trait

c++ - 是否有必要通过常量引用传递迭代器

classT{unordered_maptable;...voidupdateA(constunordered_map::iterator&iter){iter->second=100;}voidupdateB(unordered_map::iteratoriter){iter->second=100;}};问题>哪个函数更好(即updateS或update)?如果你有更好的,请提出。谢谢 最佳答案 1)首先,回答标题中的问题,是否有必要通过(const)引用传递迭代器:否。迭代器充当代理容器中的数据项,无论迭代器本身是否是另一个迭

c++ - 在相同的输入迭代器范围内并排运行两个 <algorithm>

如果我想计算从std::istream中检索到的一堆数字的总和,我可以执行以下操作://std::istream&is=...inttotal=std::accumulate(std::istream_iterator(is),std::istream_iterator(),0);但是,如果我想计算它们的平均值,我需要累加两个不同的结果:总和(std::accumulate)总计数(std::distance)有什么方法可以“合并”这两种算法并在迭代器范围的一次传递中“并排”运行它们吗?我想做类似的事情:usingstd::placeholders;inttotal,count;std

c++ - vector 迭代器不可解引用

我有一个名为Shape的抽象基类,Circle和Rectangle都派生自该基类,但是当我在VS2005中执行以下代码时,出现调试断言失败的错误。同时我没有在任何类中重载==运算符Expression:Vectoriteratornotdereferencable,这是什么原因。vectors1;s1.push_back(newCircle(point(1,2),3));s1.push_back(newCircle(point(4,3),5));s1.push_back(newRectangle(point(1,1),4,5));vectors2(s1);reverse(s1.begi

带有模板的 C++ 迭代器

我有一个关于如何在模板方式下使用迭代器的问题。这是我正在尝试做的一个例子,问题是,在for循环中,我如何初始化迭代器pp?我看过一个类似的问题,但由于我是初学者,所以我不能完全理解。WhatshouldtheiteratortypebeinthisC++template?任何人都可以提供帮助并提供一些简单的解释吗?#include#includetemplatevoidmy_print(std::vectorinput){for(std::vector::iteratorpp=input.begin();pp!=input.end();++pp)std::coutaa(10,9);my

c++ - 使用索引与迭代器将 vector 迭代到倒数第二个元素

当从C++11std::vector的开头迭代到倒数第二个元素时,首选样式是什么?std::vectorargv;std::stringstr;是否应该使用这种更像C++的方法for(constauto&s:decltype(argv)(argv.begin(),argv.end()-1)){str+=std::string(s)+'';}还是应该首选更传统的方式?for(size_ti=0;i 最佳答案 请不要这样写:for(constauto&s:decltype(argv)(argv.begin(),argv.end()-1)