草庐IT

ITERATOR

全部标签

c++ - 在自定义迭代器上应用 reverse_iterator 后引用失效

我实现了一个双向迭代器,但它不是对数据结构进行操作,而是返回一个可以在两个方向上迭代计算的数学序列。事实上,我正在迭代整数,使用++和--在int上。这意味着数据不会存储在不同的结构中,因此当迭代器超出范围时,值也会超出范围。尽管如此,我希望下一个代码(最小失败示例)示例能够工作,因为迭代器始终保持在范围内。但它不起作用:(#include#include#includeclassmy_iterator:publicstd::iterator{intd_val=12;public:my_iteratoroperator--(int){std::cout();int&i=*it;if(t

c++ - 从 back_insert_iterator 中提取容器的 value_type 的特征类

std::back_insert_iterator的value_type等于void,但它还有一个protected成员container包含指向底层Container的指针。我正在尝试编写一个traits类来提取容器的value_type,如下所示:#include#include#includetemplatestructoutit_vt:OutputIt{usingself_type=outit_vt;usingvalue_type=typenamestd::remove_pointer_t().container)>::value_type;};intmain(){std::v

c++ - 取消引用字符串迭代器产生 int

我收到这个错误comparisonbetweenpointerandinteger('int'and'constchar*')对于下面的代码#include#include#includeusingnamespacestd;intmain(){std::strings("teststring");for(autoi=s.begin();i!=s.end();++i){cout为什么取消引用字符串迭代器会产生int而不是std::string? 最佳答案 实际上,它不会产生int,它会产生char(因为字符串迭代器会迭代字符串中的字符

c++ - C++中的优先级队列

有没有办法在C++中迭代优先级队列?我的理解是它们或多或少是不可变的,容器的唯一操作是对顶部元素。我希望能够打印出优先级队列的内容,但不确定如何解决该问题。 最佳答案 底层容器是一个名为c的protected数据成员(更多细节参见here)。因此,您始终可以从std::priority_queue继承并导出该容器上的几个迭代器(如果可用)。作为一个最小的工作示例:#include#includestructMyPriorityQueue:std::priority_queue{autobegin()const{returnc.beg

c++ - std::map::begin() 之前的 STL 迭代器

在C++11的std::map中,是否有一些有效的迭代器x使得++x保证等于map::开始()?我想检测我刚刚调用的函数(我的)是否已经将迭代器从函数的前面移开。该函数会将迭代器恰好向后移动一个位置。答案是否适用于图书馆的其他人? 最佳答案 不,std容器中开始之前的迭代器都是UB(反向迭代器除外,它可能无法解决您的问题)。您可能需要修复有问题的函数。如果做不到这一点,请将其包装起来并在调用它之前捕获不良行为。如果做不到这一点,您可以在map键类型排序中插入一个负无穷大元素,并添加一个标记值。如果做不到这一点,您可以编写迭代器适配器

c++ - 遍历动态 vector 时 auto 的异常行为

我正在使用自动遍历vector(附加代码)。在遍历的同时,我还在后面附加了一些元素。我没想到会得到这样的输出。#include#includeusingnamespacestd;vectordynamic_vector;voidaccess(){for(autoi:dynamic_vector){if(i==3){dynamic_vector.push_back(4);dynamic_vector.push_back(5);}cout输出:123我原以为从1到5的所有数字都会被打印出来。我无法理解如何使用auto进行遍历? 最佳答案

c++ - 循环中的 Stroustrup 和溢出 size_type

我正在阅读BjarneStroustrup的“使用C++的编程原则和实践”,我需要对我在第25.5.3节中发现的令人惊讶的部分进行澄清。作者声称如果我们想遍历std::vector,然后使用像这样的循环变量for(vector::size_typei=0;i不如对vector使用迭代器安全类:for(vector::iteratorp=v.begin();p!=v.end();++p)因为,作为无符号类型,i可能会溢出。他指出使用迭代器的循环没有这样的限制。我有点困惑,因为我了解到size_type保证足够大以表示可能的最大vector,因此size_type类型的变量永远不会在这样的

c++ - 使用迭代器将部分文件流读入字符串

这是我到目前为止尝试过但没有成功的方法:std::stringReadPartial(std::ifstream&_file,int_size){std::istreambuf_iteratorfirst(_file);std::istreambuf_iteratorlast(_file);std::advance(last,_size);returnstd::string(first,last);}我知道如何阅读整个文件。std::stringRead(std::ifstream&_file){std::istreambuf_iteratorfirst(_file);std::ist

c++ - 增量运算符/迭代器实现

我想在这里弄清楚几件事:如何为具有指向下一个节点的指针的节点类编写递增运算符?如何为如下类实现迭代器?#include#includeusingnamespacestd;templateclassNode{public:Node(inti=0):val(i){}Node*&operator++(inti=0){returnnext;};Tval;Node*next;};//================================================intmain(){Node*head,*tmp1,*tmp2;tmp1=newNode(0);head=tmp1;fo

c++ - 将 std::vector 传递给修改输入数组的函数

我正在使用第三方API(准确地说是CryptEncrypt),它将C数组作为输入输出参数。从逻辑上讲,API归结为以下功能:voidadd1(int*inout,size_tlength){for(size_ti=0;i我试图避免使用原始数组,所以我的问题是我可以使用std::vector作为上述API的输入吗?类似于以下内容:#includeintmain(){std::vectorv(10);//vectorwith10zerosadd1(&v[0],v.size());//vectorwith10ones?}我可以使用vector的“连续存储”保证向它写入数据吗?我倾向于相信这没