草庐IT

ITERATOR

全部标签

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++ - 通过引用使用 vector<int>::iterator 但有错误

#include#includeusingnamespacestd;intmain(){vectorvec={1,2,3,4};for(auto&it=vec.begin();it!=vec.end();++it){cout大家好,在C++中,我通过引用使用迭代器,例如“auto&it”,编译器返回错误"error:invalidinitializationofnon-constreferenceoftype'__gnu_cxx::__normal_iterator>&'fromanrvalueoftype'std::vector::iterator{aka__gnu_cxx::__n

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++ - 为什么我不能删除 vector 的最后一个元素

我有一个由多个元素组成的STLvector。我需要遍历这个vector并删除满足某些条件的元素。所以我写了这段代码for(intj=imageDataVector.size()-1;j>=0;j--){if(imageDataVector[i]这段代码几乎适用于所有情况,但是如果vector的所有元素都满足标准,我会得到一个错误:vectoreraseiteratoroutsidetherange如果vector中只剩下一个元素,则会发生此错误。我做错了什么? 最佳答案 if(imageDataVector[i]应该是:if(ima

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::ifstream、std::istream_iterator 和 std::copy 不读取整个文件

我在一个188字节的文件中使用了以下代码:std::ifstreamis("filename",std::ios::binary);std::vectorbuffer;std::istream_iteratori_input(is);std::copy(i_input,std::istream_iterator(),std::back_inserter(buffer));std::cout但是它只读取了188个字节中的186个字节。我已经在十六进制编辑器和ls-al中确认了文件大小。 最佳答案 我不知道为什么,但默认情况下似乎会跳过

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++ - std::shuffle 不能用 std::list 编译

我正在尝试打乱一些生成元素的列表。这是代码:std::default_random_enginegenerator(10);std::listlist(10);intn=0;std::generate(list.begin(),list.end(),[&]{returnn++;});std::shuffle(list.begin(),list.end(),generator);它不编译。以下是错误:/include/c++/v1/algorithm:3059:34:Invalidoperandstobinaryexpression('std::__1::__list_iterator'

C++ list<T>::iterator 不能在派生类模板中使用

g++编译器给出了这个错误:expected`;'在“它”之前templateclassmyList:publicstd::list{public:voidfoo(){std::list::iteratorit;//compilererrorasabovementioned,why???}};谢谢。 最佳答案 在g++中。每当在模板中看到错误时:error:expected';'before'it'怀疑你需要一个类型名:typenamestd::list::iteratorit;当您在模板中声明了一个依赖于一个或多个模板参数的新类型

c++ - 向后迭代

假设我有一个vectormyvec我想反向循环遍历所有元素。我可以想到几种方法:for(vector::iteratorit=myvec.end()-1;it>=myvec.begin();--it){//dostuffhere}for(vector::reverse_iteratorrit=myvec.rbegin();rit!=myvec.rend();++rit){//dostuffhere}for(inti=myvec.size()-1;i>=0;--i){//dostuffhere}所以我的问题是什么时候应该使用它们?有区别吗?我知道第一个很危险,因为如果我传入一个空vect