草庐IT

iter_swap

全部标签

c++ - 为什么ostream_iterator需要显式声明要输出的对象类型?

在当前的C++中,ostream_iterator类的设计如下://excerptedfromthestandardC++templateclassostream_iterator{public:ostream_iterator(ostream_type&);...ostream_iterator&operator=(constT&);...};对我来说,这个设计不是最理想的。因为用户在像这样声明ostream_iterator时必须指定类型T:ostream_iteratoroi(cout);事实上,cout可以将任何类型的对象作为其参数,而不仅仅是一种类型。这是一个明显的限制。//

c++ - copy_backward 还是用 reverse_iterators 复制?

在实际使用上有什么区别a)向后复制b)使用reverse_iterators复制源和目标特别是一个比另一个更普遍适用吗?还有其他区别吗?更新:如果真的没有区别,那么C++文献中对这种等价性的任何引用都是值得赞赏的。这个问题背后的动机是要了解这是设计使然还是其中一个失误(比如缺少copy_if) 最佳答案 首先,copy_backward()的使用清楚地表明了开发人员打算以相反的顺序复制间隔。copy_backward()适用于原始双向迭代器,而reverse_iterator是双向迭代器的适配器,可能不如原始迭代器有效。当您需要对像

c++ - std::set::iterator 和 std::set::const_iterator 之间是否存在操作差异?

对于大多数容器,iteratortype提供对容器中值的读写访问,const_iterator类型提供只读访问。但是,对于std::set,迭代器类型无法提供读写访问,因为修改集合中的值(可能)会破坏容器不变量。因此,在std::set,两者iterator和const_iterator提供只读访问权限。这引出了我的问题:使用std::set::iterator可以做的事情之间有什么区别吗?以及你可以用std::set::const_iterator做的事情?请注意,在C++11中,容器的操作方法(例如erase)可以采用const_iterator。参数。

c++ - 关于根据 move 赋值和 move 构造函数实现 std::swap

这里是std::swap的可能定义:templatevoidswap(T&a,T&b){Ttmp(std::move(a));a=std::move(b);b=std::move(tmp);}我相信std::swap(v,v)保证没有效果并且std::swap可以如上实现。在我看来,以下引述暗示这些信念是矛盾的。17.6.4.9函数参数[res.on.arguments]1EachofthefollowingappliestoallargumentstofunctionsdefinedintheC++standardlibrary,unlessexplicitlystatedother

c++ - 为什么指针访问比 vector::iterator 访问慢? (编译器代码生成)

好吧,问题标题有点蹩脚,但我真的不知道如何更好地表达这个问题。我遇到的问题是给定一个std::vector与T*+size_tcount我的编译器(VisualStudio2005/VC++8)在指针上循环时实际上会生成比在vector上循环时更糟糕的代码。也就是说,我有一个包含vector的测试结构和另一个包含指针+计数的测试结构。现在,当编写语义上完全相同的循环结构时,带有std::vector的版本比带有指针的版本快显着(也就是说>10%)。您将在下面找到代码以及生成的程序集。如果有人可以解释这里发生了什么,那就太好了。如果您查看程序集,您会注意到原始指针版本如何生成稍微多一些的

c++ - 关于 swap() 操作的异常安全——这有什么问题?

我一直在阅读swap()操作,例如:templatevoidswap(T&a,T&b){Ttemp(a);a=b;b=temp;}在我们处理异常安全时是有问题的。这有什么问题?此外,我们如何解决它? 最佳答案 在一般实现中,假设T的任何操作可以throw,您不能提供强异常保证,这意味着在发生异常时完全保持操作之前的状态。即使每个操作都在T上进行提供强大的异常保证:templatevoidswap(T&a,T&b){Ttemp(a);//[1]a=b;//[2]b=temp;//[3]}如果[1]抛出异常,则输入保持不变,这很好。如果

c++ - 为什么 swap 在 C++ 中不使用 Xor 操作

我了解到异或运算可以用来实现有效的交换功能。像这样:templatevoidswap(T&a,T&b){a=a^b;b=a^b;a=a^b;}但是我在网上能找到的swap实现基本上是这样的:templatevoidswap(T&a,T&b){Ttemp(a);a=b;b=temp;}编译器似乎没有为上面的两种形式生成相同的代码,因为我在VC++2010上对其进行了测试,第一个比std::swap更快地完成了工作。第一个有便携性或任何其他问题吗?请随时纠正我的任何错误,因为我不是英语母语,也不擅长C++。(编者注:测试可能是使用未优化的调试版本完成的,而不是std::swap可以内联的发

c++ - 标准库中 boost::make_transform_iterator 的等价物是什么?

处理constvector时,以下内容不起作用:conststd::vectorv;v.push_back("test");//error:vcannotbemodified相反,您必须在构造它的同一行上初始化vector。然而,即使有这个限制,boost::make_transform_iterator使得在将它们插入v之前对另一个vector的元素做一些事情变得容易。在这个例子中,convert是一个一元函数,返回输入元素的转换版本:autobeg=boost::make_transform_iterator(args.begin(),convert);autoend=boost:

c++ - 为什么在分配器中允许 `propagate_on_container_swap == false`,因为它可能导致未定义的行为?

注意:最初由MattMcnabb提问作为comment在WhycanswappingstandardlibrarycontainersbeproblematicinC++11(involvingallocators)?.标准(N3797)说如果progagate_on_container_swapAllocator内部是std::false_type如果所涉及的两个分配器比较不相等,它将产生未定义的行为。为什么标准会允许这样的构造,因为它看起来非常危险?23.2.1p9GeneralContainerRequirements[container.requirements.general

c++ - iterator 和 const_iterator 之间的比较是否效率低下?

变体a:constautoend=whatever.end();for(autoit=whatever.begin();it!=end;++it){//...}变体b:constautoend=whatever.cend();//notethecalltocendinsteandofendherefor(autoit=whatever.begin();it!=end;++it){//...}是否有任何理由相信变体b会比变体a效率低,因为循环条件比较两种不同类型的迭代器?这会导致对它进行隐式转换吗?(end在for循环中多次使用,因此我想把它吊出来。) 最佳答