草庐IT

c++ - 调用 erase() 后 std::map::iterator 出现问题

//erasingfrommap#include#includeusingnamespacestd;intmain(){mapmymap;map::iteratorit(mymap.begin());//insertsomevalues:mymap['a']=10;mymap['b']=20;mymap['c']=30;mymap['d']=40;mymap['e']=50;mymap['f']=60;it=mymap.find('a');mymap.erase(it);//erasingbyiterator//showcontent:for(;it!=mymap.end();it++

c++ - 如何避免在 C++ 中将 const_cast 与 std::vector::erase() 一起使用?

我有这样一个类:templateclassAdjacencyList{public:voiddelete_node(constT&);protected:consttypenamestd::vector::const_iterator_iterator_for_node(conststd::vector&,constT&);};templatevoidAdjacencyList::delete_node(constT&node){_nodes.erase(_iterator_for_node(_nodes,node));}templateconsttypenamestd::vector

c++ - 为什么 std::vector 迭代器在 erase() 调用后失效?

C++引用明确指出,在迭代器上调用std::vector::erase(it)将使指向和之后指向被删除元素的所有迭代器失效。http://en.cppreference.com/w/cpp/container/vector/erase我确实理解为什么这样的迭代器在erase调用后变得不可取消引用,但我很好奇为什么它们需要变得无效,需要哪些实现细节?例如,标准规定std::vector必须使用连续存储的元素来实现,元素不仅可以通过迭代器访问,还可以使用指向元素的常规指针的偏移量因此,此类容器的迭代器可能会实现为指针似乎合乎逻辑-但指针如何变得无效? 最佳答案

c++ - C++ string erase return *this 是什么意思?

所以C++字符串函数string&erase(size_tpos=0,size_tn=npos)返回*this。那是什么意思?为什么我需要它来返回任何东西?例子stringname="jimmy";name.erase(0,1);将删除j并变成immy,但为什么我需要它来返回任何东西? 最佳答案 用于方法链。例如,删除后,您可以在其上调用==来检查一些内容:stringname="jimmy";boolb=name.erase(0,1)=="immy"; 关于c++-C++stringe

c++ - 模板化 "find-and-erase"函数出错

templateboolFindAndErase(CONTAINER_TYPE&cont,constCONTAINER_VALUE_TYPE&value){CONTAINER_TYPE::iteratorit=eastl::find(cont.begin(),cont.end(),value);if(it!=cont.end()){cont.erase(it);returntrue;}returnfalse;}此代码在VisualC++2005上编译良好,但使用ARM编译器(“ARMC/C++编译器,RVCT4.0”)和iOSgcc(“arm-apple-darwin9-gcc(GCC

c++ - 为什么 std::set<K, C, A>::erase 不采用 const_iterator?

看来,根据ISO148822003(又名C++的神圣标准)std::set::erase需要iterator作为参数(不是const_iterator)from23.3.3[2]voiderase(iteratorposition);可能还值得注意的是,在我的VS2008附带的STL实现中,删除需要一个const_iterator。当我试图用另一个编译器编译我的代码时,这导致了一个不愉快的惊喜。现在,因为我的版本需要const_iterator,然后可以用const_iterator实现删除(好像这不是不言而喻的)。我想标准委员会已经考虑了一些实现(或手头现有的实现),这需要删除才能采

c++ - 获取字符串的一部分,std::string::erase 或 std::string::substr 哪个更快

我正在检索和存储我可以使用std::string::erase或std::string::substr的字符串的一部分。我想知道以下哪种方法更快(完成时间更短)和效率更高(内存分配/重新分配更少)。此外,有关内存如何通过erase和substr分配/重新分配的任何信息都将非常有帮助。谢谢!std::stringnodeName("ABCD#XYZ#NodeName");conststd::stringlevelSeparator("#");选项1:使用std::string::substrstd::string::size_typenodeNameStartPosition=nodeN

c++ - STL 关联容器 : erasing and getting back the (noncopyable) element

我正在使用STL关联容器(std::set和std::map),其中包含一个std::unique_ptr键。实例。键定义等效于以下内容:structKey{std::unique_ptrobject;booloperator==(constKey&rhs)const{returnobject->equal(*rhs.object);}booloperatorless(*rhs.object);}}众所周知,STL关联容器(尤其是自C++11起)无法获取对要移动的键的非常量引用。我的key是不可复制的,所以c++:Removeelementfromcontainerandgetitba

c++ - std::vector::erase(iterator position) 不一定调用相应元素的析构函数

假设我有一个包含5个元素的std::vectorV,V.erase(V.begin()+2)删除第三个元素。STLvector实现会将第4和第5个元素向上移动,然后破坏第5个元素。即删除vector中的元素i并不能保证调用ith析构函数。对于std::list,情况并非如此。删除ith元素会调用ith元素的析构函数。STL对这种行为有何看法?这是从我系统的STL_vector.h中获取的代码:392iteratorerase(iterator__position){393if(__position+1!=end())394copy(__position+1,_M_finish,__po

c++ - string::erase(0) 在空字符串上?

std::string::erase(0)的行为是否在空字符串上明确定义。因为cppreference说:Removescountcharactersstartingatindex.但对于空字符串,索引为0的字符不存在。 最佳答案 似乎没问题,因为字符串的大小是0:21.4.6.5basic_string::erase[string::erase]basic_string&erase(size_typepos=0,size_typen=npos);1Requires:pos2Throws:out_of_rangeifpos>size