草庐IT

c++ - 为 STL 容器传递模板化迭代器

对于我的C++类的练习(尚未涵盖Boost),我在编写模板化方法来接受两个迭代器以对STL容器中的数值求和时遇到问题。考虑以下示例:#include#include#includetemplatedoubleSum(constT&c){return42.0;//implementationstubbed}//needhelpwritingthismethodsignaturetoaccepttwoiteratorstemplatedoubleSum(consttypenameT::const_iterator&begin,consttypenameT::const_iterator&e

c++ - 在 C++ 中保存指向迭代器的指针是否安全?

我会先问问题,再问动机,最后是按预期编译和执行的说明性代码示例。问题如果我可以确保迭代器在我需要使用它的期间内不会失效,那么保存指向迭代器的指针(例如指向list::iterator的指针)是否安全。动机我有多个容器,我需要从一个容器中的项目直接交叉引用到另一个容器中的相应项目等等。一个容器中的项目可能并不总是在另一个容器中有相应的项目。因此,我的想法是将指向容器#2中元素的迭代器的指针存储在容器#1中存储的元素中,依此类推。为什么?因为一旦有了迭代器,我不仅可以访问容器#2中的元素,而且如果需要,我还可以删除容器#2中的元素等。如果容器#2中有相应的元素,我将在容器#1中的元素中存储

c++ - 将迭代器返回到 C 数组的方法的正确类型声明

我可以这样遍历C风格的数组:charfoo[3]={'a','b','c'};for(autoit=std::begin(foo);it!=std::end(foo);++it){*it='k';//valuesoffooarecorrectlymodified}现在假设我想将数组包装在一个类中,并公开返回相关迭代器的begin()和end()方法。我尝试了以下方法:templateclassStackMemPolicy{private:charmem[size];public:typedeftypenamestd::iteratoriter;iterbegin(){returnstd

c++ - 在 C++ 中为循环编写迭代器的更好方法是什么

对于一个非常简单的事情,例如打印vector中的每个元素,在C++中使用什么方法更好?我一直在用这个:for(vector::iteratori=values.begin();i!=values.end();++i)之前,但在我看到的其中一个Boost::filesystem示例中是这样的:for(vec::const_iteratorit(v.begin()),it_end(v.end());it!=it_end;++it)对我来说,它看起来更复杂,我不明白为什么它比我一直使用的更好。你能告诉我为什么这个版本更好吗?或者它对于像打印vector元素这样的简单事情并不重要?i!=val

c++ - 删除 std::list::iterator 不会使迭代器无效并销毁对象吗?

为什么下面打印2?listl;l.push_back(1);l.push_back(2);l.push_back(3);list::iteratori=l.begin();i++;l.erase(i);cout我知道erase返回什么,但我想知道为什么这样可以?或者它是未定义的,还是取决于编译器? 最佳答案 是的,这是未定义的行为。您正在取消引用一种野指针。在erase之后,您不应该使用i的值。是的,erasedestructs指向的对象。但是,对于POD类型,销毁不会执行任何操作。erase不会为被删除的迭代器分配任何特殊的“空”

c++ - 检测迭代器是否是 std::map 的最后一个元素

这类似于thisquestion但不是重复的。我正在尝试遍历map并打印每个元素的值,但最后一个元素的输出略有不同。在那个问题中,他们建议使用map.rbegin().base(),但它对我不起作用。这是我的代码:#include#includeintmain(){std::mapcharMap={{'a',1},{'b',2},{'c',3},{'d',4}};for(autoiter=charMap.begin();iter!=charMap.end();iter++){std::coutfirstsecond;if(iter==charMap.rbegin().base())st

c++ - 比较字符串迭代器和字符指针

我在函数中有一个constchar*conststring。我想用它来比较字符串中的元素。我想遍历字符串,然后与char*进行比较。#include#include#includeusingnamespacestd;intmain(){constchar*constpc="ABC";strings="TestABCStrings";string::iteratori;for(i=s.begin();i!=s.end();++i){if((*i).compare(pc)==0){cout如何解析char*以解析字符串迭代器?谢谢.. 最佳答案

c++ - 反向迭代器不会编译

我正在尝试编译一个反向迭代器,但我这样做的尝试造成了可怕的困惑。代码的最小示例是...#include#include#includeclassfrag{public:voidprint(void)const;private:std::vectora;};voidfrag::print(void)const{for(std::vector::reverse_iteratoriter=a.begin();iter!=a.end();++iter){std::cout并试图编译它产生以下...Infileincludedfrom/usr/include/c++/4.4/bits/stl_a

c++ - 迭代器是否支持+运算符?

我看到以下代码用于从std::vector中删除一个选定的元素:vector::iteratorit;intiIndex=0;constintiSelected=5;for(it=vecPoints.begin();it!=vecPoints.end();++it,++iIndex){if(iIndex==iSelected){vecPoints.erase(it);break;}}我认为这段代码效率不高,应该这样写:vector::iteratorit;intiIndex=0;constintiSelected=5;//weassumethevectorhasmorethan5ele

c++ - pop_back() 是否真的使 std::vector 上的 *all* 迭代器无效?

std::vectorints;//...fillintswithrandomvaluesfor(std::vector::iteratorit=ints.begin();it!=ints.end();){if(*it此代码无效,因为调用pop_back()时,它无效。但我没有找到任何文档讨论std::vector::pop_back()中迭代器的失效。你有相关链接吗? 最佳答案 调用pop_back()删除vector中的最后一个元素,因此该元素的迭代器无效。pop_back()调用不会使最后一个元素之前的项目的迭代器无效,只有重