草庐IT

Front-end

全部标签

c++ - 为非数组重载 std::begin() 和 std::end()

假设我有以下Data类:structData{charfoo[8];charbar;};和以下函数,my_algorithm,它采用一对char*(类似于STL算法):voidmy_algorithm(char*first,char*last);对于Data的foo数据成员,而不是像这样调用my_algorithm():Datadata;my_algorithm(data.foo,data.foo+8);我可以使用std::begin()和std::end()便捷功能模板:my_algorithm(std::begin(data.foo),std::end(data.foo));我想实

c++ - 删除时 std::list end() 迭代器位置是否改变?

在下面的循环中,我使用了一个预先计算好的结束迭代器:std::list::iteratorend=MyList.end();for(std::list::iteratorit=MyList.begin();it!=end;)it=MyList.erase(it);当删除std::list中的元素时,MyList.end()是否可以更改其值以便end!=MyList.end()不再存在? 最佳答案 没有。n337623.3.5.4iteratorerase(const_iteratorposition);iteratorerase(c

c++ - 定义为 "_end[LEN]"的数组在 C/C++ 中导致段错误

这个问题在这里已经有了答案:WhataretherulesaboutusinganunderscoreinaC++identifier?(5个答案)关闭7年前。我试图在C/C++中定义一个名为_end的全局数组,大小约为1000,但即使我只是简单地迭代它,我也会遇到段错误。名称“_end”在导致此类问题的C/C++中是否非常特殊?或者这可能是一个非常严重的错误......(代码附在下面,它在g++4.3.2、4.5.2、4.9.2等中中断)#includeusingnamespacestd;int_end[1111];intmain(){for(inti=0;i您可以在https://

c++ - C++ 代码 `x.erase(std::remove(x.begin(), x.end(), ' '), x.end())` 是如何工作的?

问题是我通常会使用for循环来处理这种事情,但这种方法似乎更有效率。cplusplus的文档对我来说有点难以理解。std::stringno_space(std::stringx){x.erase(std::remove(x.begin(),x.end(),''),x.end());returnx;} 最佳答案 函数std::remove(x.begin,x.end),'')将元素移动到字符串的末尾,函数std::erase实际上删除了被移动到字符串末尾的元素。您还可以在文档中阅读更多相关信息enterlinkdescription

C++ 标准 : end of lifetime

在basic.lifeC++标准的一部分,可以找到以下内容(强调我的):ThelifetimeofanobjectooftypeTendswhen:ifTisaclasstypewithanon-trivialdestructor([class.dtor]),thedestructorcallstarts,orthestoragewhichtheobjectoccupiesisreleased,orisreusedbyanobjectthatisnotnestedwithino([intro.object]).我正在尝试查找对象o的存储示例,该对象被嵌套在o中的对象重用(相反标准所说的

c++ - 匹配可迭代类型(具有 begin()/end() 的数组和类)

这个问题在这里已经有了答案:Checkifavariabletypeisiterable?(6个答案)关闭9个月前。我写了类型特征,比如可以用来测试给定类型是否“可迭代”的类。对于数组(对于T[N],而不是对于T[])和具有begin和的类来说都是如此>end方法返回看起来像迭代器的东西。我想知道是否可以做得比我做的更简洁/更简单?特别是impl命名空间中的东西看起来有点迂回/hacky。这一切在我看来都有点难看。有关使用它并可以用g++和clang++编译的示例,请参见:https://gist.github.com/panzi/869728c9879dcd4fffa8templat

c++ - 为什么在 std::copy 期间使用 std::back_inserter 而不是 end()?

我见过std::copy()使用std::back_inserter但我使用了std::end()并且两者都有效.我的问题是,如果std::end()工作正常,为什么还需要std::back_inserter?#include#include#include#includeusingnamespacestd;intmain(){//Declaringfirstcontainervectorv1={1,2,3};//Declaringsecondcontainerfor//copyingvaluesvectorv2={4,5,6};//Usingstd::back_inserterins

c++ - 为具有 "end"成员变量的类型启用基于范围的 for

我正在使用avectortype来自C库,看起来类似于structVec{int*stor_begin;int*stor_end;int*end;};我试图通过创建免费的begin()和end()函数为这种类型启用基于范围的for循环,但是我从clang得到了这个错误:error:rangetype'igraph_vector_int_t'has'end'memberbutno'begin'member有没有办法(使用C++11)为这种类型(我不能直接修改)启用基于范围的for循环?这是一个演示问题的最小示例://NoproblemswithFoostructFoo{int*fooBe

c++ - 使用 std::vector.erase(begin(), end()) 或 std::vector.erase(begin(), begin()) 安全吗?

我想处理vector中的元素一段时间。为了优化这一点,我不想在处理项目时删除它,而是在最后删除所有已处理的项目。vector::iteratorit;for(it=items.begin();it!=items.end();++it){DoSomething(*it);if(TimeIsUp()){break;}}items.erase(items.begin(),it);当it==items.end()时使用erase是否安全?在文档中说erase()将删除[first,last)并且这应该是安全的,但我想确定。编辑:使用std::vector.erase(begin(),begin

c++ - 如何正确的va_end?

#includeusingnamespacestd;voiddo_something(va_listnumbers,intcount){//^//ShouldIcallthisbyreferencehere?Imean,va_list&numbers?//...stuffva_end(numbers);}voidsetList(intcount,...){va_listnumbers;va_start(numbers,count);do_something(numbers,count);}intmain(){setList(2,0,1);return0;}当将va_list传给另一个函