在学习C++中的迭代器时,我尝试了以下方法:#includeintmain(){std::vectora;a.end()=a.begin();//Whyisthisevenallowedbythecompiler?}我错过了什么? 最佳答案 如果例如函数结束将返回一个指针,那将是不可能的。例如这段代码不会被编译inta[]={1,2,3};std::end(a)=std::begin(a);GCC问题error:lvaluerequiredasleftoperandofassignmentstd::end(a)=std::begin
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭5年前。Improvethisquestion为什么容器提供"begin"/"end"迭代器而算法需要"first"/"last"迭代器?例如:vector提供.begin()和.end()(cppreference.com,cplusplus.com)。sort需要参数first和last(cppreference.com,cplusplus.com)。编辑:发现一个更大的差异。不仅仅是算法使用“first/last”,它也是容器构
在使用std::find找到一个元素后,我需要从std::list中删除它。使用列表的end()调用std::list::erase的行为是什么?我的情况是这样的:std::listmylist;Tvalue;std::list::iteratorit=std::find(mylist.begin(),mylist.end(),value);std::list::iteratornext=mylist.erase(it);cplusplus.com说:Ifposition(ortherange)isvalid,thefunctionneverthrowsexceptions(no-th
我正在为容器类型创建一个方便的display()函数模板。最后一个元素的输出与其余元素不同,因此我检查何时myIterator!=--cont.cend();。这适用于std::vector,但不适用于std::array。为什么?这是一个MWE(不是我的实际代码):std::vectorvec({1,2});std::arrayarr({{1,2}});autovecIt=--vec.end();//OKautoarrIt=--arr.end();//error:lvaluerequiredasdecrementoperand 最佳答案
根据C++标准,如果vector的新大小超过其容量,则对vector调用push_back()会使迭代器失效,但在列表上它永远不会使迭代器失效。现在考虑以下代码片段:1.vectorv{1,2,3};v.reserve(100);for(inti:v){v.push_back(i);}2.listl{1,2,3};for(inti:l){l.push_back(i);}我用gcc4.8试了一下,发现代码1以v结束时为{1,2,3,1,2,3},但代码2运行进入无限循环。对我来说,解释似乎很简单:vector的end()迭代器指向一个内存位置,并且由于itisonlyevaluatedo
header提供std::equal_range(),以及一些将它作为成员函数的容器。这个函数让我困扰的是它返回一对迭代器,这使得从开始迭代器到结束迭代器的迭代变得乏味。我希望能够使用std::begin()和std::end()这样我就可以使用C++11基于范围的for循环。现在,我听到了关于特化的矛盾信息std::begin()和std::end()-有人告诉我,向std命名空间添加任何内容都会导致未定义的行为,而我也被告知您可以提供自己的std::begin()特化。和std::end().这就是我现在正在做的:namespacestd{template::iterator_ca
list的end()返回尾后迭代器的拷贝,对吧?因此,list.end()是一个右值,对吗?为列表迭代器重载的--运算符函数采用非常量引用,对吧?不能将右值绑定(bind)到非常量引用,对吗?那怎么会呢std::listlst;//...--l.end();`编译?正如正确指出的那样,我的第三点不一定是正确的。但是这段也可以编译的代码怎么样?structA{};voidf(A&){}Aa(){returnA();}intmain(){f(a());} 最佳答案 the--operator-functionoverloadedforl
我想在函数模板中使用一个简单的结构,其成员变量名为start和end:#includeusingnamespacestd;structst{intstart;intend;};templatevoidcompare(constT&v1,constT&v2){if(v1.end但是这个程序无法在mingwg++4.8.2上编译:main.cpp:Infunction'voidcompare(constT&,constT&)':main.cpp:11:11:error:parseerrorintemplateargumentlistif(v1.end为什么不呢?我的代码有什么问题?
是C++primerfifthedition3.26的一道题,不知道有什么区别?可能是第二种可以避免溢出。 最佳答案 Maybethesecondonecanavoidoverflow.没错。不能保证beg+end是可表示的;但在第二种情况下,中间值以及预期结果不大于end,因此不存在溢出的危险。第二种形式也可用于仿射类型,如指针和其他随机访问迭代器,它们可以相减得到距离,但不能相加。 关于c++-二进制搜索中mid=(beg+end)/2和mid=beg+(end-beg)/2有什么区
我想知道使用rbegin()而不是end()-1对STL容器有什么好处。例如,你为什么要使用这样的东西:vectorv;v.push_back(999);vector::reverse_iteratorr=v.rbegin();vector::iteratori=r.base();而不是:vectorv;v.push_back(999);autor=v.end()-1; 最佳答案 rbegin()返回一个带有reverseoperator++的迭代器;也就是说,使用reverse_iterator,您可以向后遍历容器。例子:#inc