草庐IT

ostream_iterator

全部标签

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++ - std::map<t1, t2>::erase(iterator position) 的工作?

我阅读了cplusplus.com通过将迭代器作为参数传递来删除std::map中元素的操作是常量时间。如果我没记错(请纠正我),迭代器基本上是指向map中元素的指针,带有++运算符,只返回当前元素的有序后继我想这就是遍历std::map时排序结果的实现方式。现在如果map是一棵红黑树,删除一个元素(使用它的地址)不应该是对数时间操作,我想知道他们是如何在恒定时间内完成的(除非有一个高度内存浪费的替代方案这样做)。 最佳答案 首先,我会对您从cplusplus.com获得的任何信息保持警惕;该网站已知有一些错误。来访cpprefer

c++ - std::ostream_iterator 防止最后一项使用定界符

这个问题在这里已经有了答案:HowcanIprintalistofelementsseparatedbycommas?(33个答案)关闭6年前。有没有一种方法可以使用std::ostream_iterator(或类似的),以便不为最后一个元素放置定界符?#include#include#include#includeusingnamespacestd;intmain(intargc,char*argv[]){std::vectorints={10,20,30,40,50,60,70,80,90};std::copy(ints.begin(),ints.end(),std::ostrea

c++ - 为什么在使用 const_iterators 时可以将元素插入 vector 中

考虑下面的代码,#include#include#includeusingnamespacestd;intmain(){vectorvalue{22,23,25,34,99};autoit=find(value.cbegin(),value.cend(),25);value.insert(it,77);return0;}这里它是一个const_iterator。在插入之前,它指向25。插入后指向77。这不会被视为修改吗? 最佳答案 const_iterator阻止您修改迭代器指向的元素,它不会阻止您修改容器本身。在您的示例中,您要查

c++ - 使用 std::iterator traits 和 auto 在函数声明中定义一个函数

今天我尝试实现基数排序。该函数必须有两个变量:开始迭代器和结束迭代器,并且可以有第三个:一些必须返回整数类型以进行排序的函数。默认情况下,它必须是恒等函数。我的尝试看起来像(抱歉,代码看起来又长又脏,但这只是一个尝试):templatevoidradix_sort(ForwardItfirst,ForwardItlast,std::function::value_type)>get_value=[](consttypenamestd::iterator_traits::value_type&x){returnx;}){//...}get_value的返回类型当然会在编译时知道。用法应该

C++ 将 ostream 作为参数传递

我正在为虚拟rolodex做一个家庭作业项目,该项目需要一个主类、一个rolodex类和一个卡片类。要将所有“卡片”的内容输出到控制台,任务说明main()应该调用rolodex类中的show(...)函数,将其传递给ostream和show(...)然后迭代在卡片上,调用它们的每个showCard()函数。实际显示是由卡片对象的showCard()函数完成的,显示在提供的ostream上。我不明白的是为什么ostream会/应该被传递到任何地方。似乎作业要求这样的事情:main(){RolodexmyRolodex;ostreammyStream;myRolodex.show(myS

c++ - 如何使用 std::reverse_iterator 删除 *AND CONTINUE*?

我一直在stackoverflow上上下下,甚至是非常非常好的Dr.Dobbsarticle但我找不到这个问题的明确答案。Whataretheshortcomingsofstd::reverse_iterator?问题的部分答案说这可能根本不可能。std::list::reverse_iteratorit=list.rbegin();while(it!=list.rend()){intvalue=*it;if(some_cond_met_on(value)){++it;list.erase(it.base());}else{++it;}}PS:我知道还有其他选择,例如erase_if(

C++ 中 <iterator> <functional> <numeric> 库好用的函数

C++中库好用的函数泰裤辣!简述:迭代器省代码用的。std::advance记忆方法:advance-前进。形如:advance(it,step),表示it迭代器自增step步。实现类似于:functionadvance(&it,n): whilen>0: --n ++it whilen或functionadvance(&it,n): it+=nstd::next&std::prev记忆方法:自己问英语老师。形如next(it,n)及prev(it,n),默认n=1,表示迭代器前移、后移n位。为std::advance的变体,区别在于返回了迭代器而传入迭代器不改变。实现类似于:functi

c++ - 我应该使用其他人的 streambuf 创建一个临时的 ostream 吗?

假设我有一个接受ostream&的函数参数o并写入该ostream。一个operator实现将是一个很好的例子。ostream&operator在该函数中,我可能想要指定流的格式化选项。例如,无论o如何打印,我可能都希望将数字打印为十六进制。在传入函数时配置。其次,我可能希望能够对当前的格式标志做出假设。例如,除非我另有要求,否则能够假定数字格式为十进制会很好。最后,当函数退出时,我想要o上的格式化选项与调用函数之前相同,以便在调用者看来没有变化。这只是对来电者的礼貌问题。到目前为止,我已经通过创建本地ostringstream实现了这一点在函数中,完成我所有的工作(包括设置格式选项)

c++ - 支持 std::ostream operator << 中的 const_string

我目前正在使用非常聪明的包boost::const_string直到http://libcxx.llvm.org/可以在Ubuntu或GCC上预先打包,使其成为__versa_string(在headerext/vstring.h中)它的默认字符串实现。libcxx的std::string以及__versa_string默认使用_small-string优化(SSO)。默认支持输出到std::ostream然而缺乏。代码#include#includeconst_stringx;std::cout除非我们强制x否则不起作用通过c_str()进入C字符串这变成了std::cout它按预期