草庐IT

Iterator

全部标签

c++ - UTF-8 字符串迭代器

我正在尝试编写一个支持Unicode的跨平台应用程序。我正在使用库UTF8-C++(http://utfcpp.sourceforge.net/)但我在遍历字符串时遇到问题:strings1="Добрыйдень";utf8::iteratoriter(s1.begin(),s1.begin(),s1.end());for(inti=0;i上面的代码,当重定向到UTF-8格式的文本文件时,会产生以下输出:6363636363633263636363如何让s1的内容正确出现在文件中? 最佳答案 您需要确保使用正确的数据初始化字符串,

c++ - 从 std::map 插入/删除元素是否会修改迭代序列?

假设我有以下代码:typedefstd::map::iteratorIterator;Iteratoriter=myMap.begin();while(iter!=myMap.end()){Iteratorcurrent=iter;++iter;maybeDeleteElement(current)//maycallerase.}鉴于std::map是作为红黑树实现的,能否保证映射中的每个元素都恰好被访问一次?还是修改map会导致树重新平衡,从而改变迭代顺序?注意:这不是关于任何迭代器是否会失效的问题。但是保持有效的迭代器并不一定意味着递增它会为您提供与之前相同的下一个元素。

c++ - 使用迭代器查找 vector 的中间元素 - C++

我有两个问题。第一个问题我正在阅读C++primer5thedition一书中关于C++的迭代器。在本书的一个代码示例中,给出了以下代码片段将找到vectorvi中的中间元素automid=vi.begin()+vi.size()/2;现在我想问一下,为什么在vi.size()中加入了vi.begin()?vi.size()/2是否足以找到vectorvi中的中间元素?第二个问题automid=vi.begin()+vi.size()/2;在此代码片段中,如果我像这样在vi.begin()+vi.size()周围添加括号:automid=(vi.begin()+vi.size())/2

c++ - 迭代器模式 - 错误 C2679 : binary '<<' : no operator found which takes a right-hand operand of type 'std::string'

这个问题在这里已经有了答案:errorC2679:binary'(1个回答)关闭5年前。我正在尝试使用迭代器模式进行迭代和打印,但出现错误这里是错误:errorC2679:binary'couldbe'std::basic_ostream&std::operator>(std::basic_ostream&,constchar*)'这是错误的来源std::coutgetName();#ifndef_ROBOT1_#define_ROBOT1_namespaceguitars{namespaceComposite{namespaceInventoryParts{usingnamespac

c++ - 指针 vector 的迭代器

我阅读了另一篇回答有关指针vector迭代器的问题的帖子。我试图在我的代码中使用相同的概念,但我收到了一些编译错误。我的代码基于的代码示例是:vectorcvect;cvect.push_back(newsc);vector::iteratorciter;for(citer=cvect.begin();citer!=cvect.end();citer++){(*citer)->func();}我想使用类似的概念为具有两个数据成员的类创建深拷贝构造函数,这两个数据成员是指向对象的指针vector。我的代码与此类似:classMyContainer{vectorvecOne;vectorv

c++ - 删除元素时 map 迭代器如何失效?

这个问题在这里已经有了答案:IteratorinvalidationrulesforC++containers(6个答案)关闭3年前。使用erase方法时,迭代器何时以及如何在映射中失效?例如:std::mapaMap;aMap[33]=1;aMap[42]=10000;aMap[69]=100;aMap[666]=-1;std::map::iteratoritEnd=aMap.lower_bound(50);for(std::map::iteratorit=aMap.begin();it!=itEnd;//no-op){aMap.erase(it++);}删除的迭代器肯定会变得无效(

c++ - 使用 CUDA Thrust 确定每个矩阵列中的最小元素及其位置

我有一个相当简单的问题,但我想不出一个优雅的解决方案。我有一个Thrust代码,它生成包含值的相同大小的cvector。假设这些cvector中的每一个都有一个索引。我想为每个vector位置获取值最低的cvector的索引:例子:C0=(0,10,20,3,40)C1=(1,2,3,5,10)作为结果,我会得到一个vector,其中包含具有最低值的Cvector的索引:result=(0,1,1,0,1)我考虑过使用thrustzip迭代器来完成它,但遇到了一些问题:我可以压缩所有cvector并实现一个任意转换,它接受一个元组并返回其最低的索引值,但是:如何迭代元组的内容?据我所知

c++ - 对 InputIterator 语义/概念要求的混淆

C++InputIterator是迭代器概念中最有限的类型之一。它只保证支持解引用、相等比较、前自增和后自增(以及后自增和解引用)因为InputIterator对象经常迭代任意流,您甚至不能确定对同一输入迭代两次会产生相同的值。不过,我很困惑,如果取消引用运算符operator*每次取消引用时都能保证返回相同的值,前提是您从不递增迭代器。例如,假设std::begin(some_input_stream)返回一个满足InputIterator概念要求的对象,而它不等于到或超过结束位置:autoit=std::begin(some_input_stream);autovalue1=*it

c++ - 为什么随机访问迭代器的算术运算符接受/返回 int 而不是 size_t?

由于std::vector上的大多数操作都需要/返回size_t-这就是我用于索引的类型。但现在我已经启用所有编译器警告来修复一些我知道的有符号/无符号转换问题,这条消息让我感到惊讶:warningC4365:'argument':conversionfrom'size_t'to'__w64int',signed/unsignedmismatch它是由这段代码生成的:std::vectorv;size_tidx=0;v.insert(v.begin()+idx+1,0);我收到很多其他类似的消息,建议迭代器的算术运算符接受并返回int。为什么不是size_t?修复所有这些消息很痛苦,并

c++ - end() 迭代器的算术运算

设A为std::vector,这是明确的吗?if(!A.empty())std::vector::iteratormyBack=A.end()-1;是end迭代器只适用于等式和不等式检查?或者只要我留在容器中,我就可以执行一些指针运算?在我的平台上,此代码有效。我想知道这是否是可移植的。 最佳答案 它是完全有效的,因为vector::iterator是一个随机访问迭代器。您可以对其执行算术运算,并且它不依赖于平台。std::vector::iteratorit=A.end();while(it!=A.begin()){--it;//