草庐IT

ITERATOR

全部标签

c++ - 在 C++ 中,是否可以实现推进使 "current"元素无效的迭代器接口(interface)?

我正在设计一个C++接口(interface),允许用户迭代从文件解码的对象。这个解码过程有点慢。我正在考虑为此使用迭代器接口(interface),但我想避免任何不必要的复制,所以我正在考虑(用户方面):for(constauto&object:file){//youcanaccessthemembersof`object`herestd::cout前面使用示例中的object是对迭代器实例内部对象的引用。这是错的吗?您会在这里建议哪些其他惯用界面?我想到了一个流接口(interface)(想想std::istream),但是据我所知,读取数据的方法也返回拷贝(它们提取字符)。

c++ - C++ STL 函数 find() 不接受用户定义类的迭代器参数

当我在std::find()中传递用户定义的迭代器参数时,GCC5.2.1。编译器(在Ubuntu15.10上)给出两条错误消息:(1)/usr/include/c++/5/bits/stl_algo.h:162:34:error:nomatchingfunctionforcallto‘__iterator_category(Text_iterator&)’std::__iterator_category(__first));(2)/usr/include/c++/5/bits/stl_iterator_base_types.h:204:5:error:notypenamed‘iter

c++ - 从不同类型容器的迭代器初始化 vector

给出以下代码:#include#includeintmain(){chararr[3]={1,2,3};std::vectorvec={1,2,3};std::vectorvec_one(std::begin(arr),std::end(arr));std::vectorvec_two(vec.begin(),vec.end());}vec_o​​ne和vec_two的初始化是未定义的、实现定义的还是根据正常类型转换规则定义的?如果交换char和int类型会怎样? 最佳答案 它们都很好,遵循将char转换为int(所以不用担心)和i

c++ - 作为返回值的 STL 迭代器

我有A类,其中包含std::vector,我想从A类外部访问vector。我首先想到的是创建一个将迭代器返回给vector的get函数,但是遍历vector我将需要两个迭代器(开始和结束)。我想知道有什么方法(技术或模式)可以只用一个迭代器迭代整个vector吗?或者也许是其他一些访问vector的方法,当然不使用vector作为返回值:) 最佳答案 为什么不在您的类中同时添加一个begin()和end()函数,只需returnv.begin();和returnv.end();?(假设v是您的vector。)classMyVecto

c++ - 将空范围(相同的迭代器)传递给 STL 算法是否会导致定义的行为?

考虑以下几点:std::vectorvec(1);//vectorhasoneelementstd::fill(vec.begin(),vec.begin(),42);std::fill(vec.begin()+1,vec.end(),43);std::fill(vec.end(),vec.end(),44);上面所有的std::fill用法都会导致定义的行为吗?我能保证vec将保持不变吗?我倾向于认为"is",但我想确保标准允许这种用法。 最佳答案 不,如果不会导致未定义的行为。该标准在24.1/7中定义了空迭代器范围,并且没有任

c++ - map<T,T>::iterator 作为参数类型

我有一个带有私有(private)映射成员的模板类templateclassMyClass{public:MyClass(){}private:std::mapmyMap;}我想创建一个接受映射迭代器的私有(private)方法voidMyFunction(std::map::iterator&myIter){....}但是,这会出现编译错误:标识符“迭代器”。我不需要传递一个抽象迭代器,因为MyFunction知道它是一个映射迭代器(并且只会用作myMap的交互器)并且会这样对待它(访问和修改myIter->second)。将myIter->second传递给MyFunction是不

c++ - 迭代 std::map<X,std::vector<Y>> 并对 vector 进行排序

遍历std::map>时,我可以对vector进行排序,还是可以使迭代器无效?也就是说,下面的代码可以吗?typedefstd::map>Map;Mapm;for(Map::iteratorit=m.begin();it!=m.end();++it){std::sort(it->second.begin(),it->second.end());} 最佳答案 您的代码没问题。map中的迭代器只有在您从map中删除元素时才会失效。修改STL容器的元素永远不会使该容器的迭代器失效,只会对容器本身进行操作,例如删除或有时添加元素。

c++ - 按照预期的方式使用迭代器、ifstream、ofstream

我有一个包含一堆单词的txt文件,每行一个。我需要阅读这个文件并将每个单词放在一个列表中然后用户将能够修改此列表完成编辑后,程序会将修改后的列表写入新文件。由于它是面向对象的C++,我将有两个类,一个用于读取/写入文件,一个用于编辑/修改列表和用户。考虑到这种方法,这是我在第一个类中的阅读功能:boolFileMgr::readToList(list&l){if(!input.is_open())returnfalse;stringline;while(!input.eof()){getline(input,line);l.push_back(line);}returntrue;}请记

c++ - 使用带嵌套 vector 的迭代器的意外行为

此示例程序获取一个迭代器,该迭代器指向包含在另一个vector中的一个vector的元素。我将另一个元素添加到包含vector中,然后打印出先前获得的迭代器的值:#include#includeintmain(intargc,charconst*argv[]){std::vector>foo(3,std::vector(3,1));std::vector::iteratorfoo_it=foo[0].begin();std::cout(3,2));std::cout由于对应于foo_it的vector没有被修改,我希望迭代器仍然有效。但是,当我运行此代码时,我得到以下输出(也在ideo

c++ - 如何使迭代器成为 "automatically dereferenced"?

假设我有这样的东西:classCollection{private:typedefstd::vector>::iteratorIterator;std::vector>data_;public:Iteratorbegin(){returndata_.begin()}Iteratorend(){returndata_.end()}}当我使用Collection::Iterator例如,我需要取消引用它一次,以获得std::shared_ptr对象并再次获得Something对象。但是如果我想制作std::shared_ptr只是一个实现细节,在一次取消引用之后,我应该得到一个Someth