草庐IT

c++ - 使用迭代器获取 vector 的索引

当迭代vector的元素时,最好使用迭代器而不是索引(参见Whyuseiteratorsinsteadofarrayindices?)。std::vectorvec;std::vector::iteratorit;for(it=vec.begin();it!=vec.end();++it){//dowork}但是,可能需要在循环体中使用索引。考虑到性能和灵active/可扩展性,在这种情况下,以下哪项更可取?回到索引循环std::vectorvec;size_ti;for(i=0;i计算偏移量std::vectorvec;std::vector::iteratorit;for(it=v

c++ - 二维数组 C++ 的列迭代器

我有一个浮点vector,我将其视为二维数组,声明为std::vectorvec(height*width);我正在处理的数值问题需要使用相同的算法在行和列中进行处理,因此我希望能够通过迭代器编写它们,并根据需要输入行迭代器或列迭代器.为了澄清,这里是访问数组的指针算术版本:valueatxy=vec[y*width+x];行迭代器形式当然很简单,假设我有一个函数templatevoidprocess(iterbegin,iterend),调用是process(vec.begin(),vec.end());现在为了能够对列操作使用相同的函数,我需要一个列迭代器。这与通常的vector迭

c++ - 如何在多个排序列表上创建迭代器?

好的,这是我得到的一道面试题,当时我的表现很一般。我想知道最佳解决方案是什么以及如何最好地实现。给定多个排序列表,构建东西,使我们能够从最小元素到最大元素遍历所有这些列表。例子:{-2,5,10}{2,9,11}{-5,9}->-5,-2,2,5,9,9,10,11更新:在SO聊天#c-questions-and-answers和特别是@Nican的帮助下,我已经让这艘船以某种方式飞起来了。我已经发布了我的工作代码作为答案,以允许其他解决方案。我在下面发布的答案仍然很乱,特别是我没有正确实现==和!=。我在这些方面仍然需要帮助。这个问题的理由在网上找到简洁的自定义迭代器实现并不常见。我

c++ - 在执行 DFS 时在 Boost::graph 中维护迭代器

Boost:graph库的大多数示例通过调用boost的深度优先搜索实用程序来执行深度优先搜索。创建顶点和边后,在图上调用DFS以深度优先的方式遍历整个图,如果我们有与之关联的访问者方法,它将调用访问者方法来执行操作,遍历每个节点。我正在寻找的是一种在图上维护迭代器的方法,而不是一次遍历图,当客户端调用“next()”时,迭代器将移动到下一个顶点遍历到DFS并再次调用next时,迭代器将移动到DFS指示的下一个顶点。是否有使用boost:graph执行上述操作的示例?谢谢 最佳答案 不幸的是,boost::graphAPI基于访问者

c++ - 为什么 vector::pop_back 会使迭代器 (end() - 1) 无效?

注意:该问题也适用于erase。见底部。end()-1迭代器在vector上调用pop_back后无效的原因是什么?为了澄清,我指的是这种情况:std::vectorv;v.push_back(1);v.push_back(2);std::vector::iteratori1=v.begin(),i2=v.end()-1,i3=v.begin()+1;v.pop_back();//i1isstillvalid//i2isnowinvalid//i3isnowinvalidtoostd::vector::iteratori4=v.end();assert(i2==i4);//undefi

c++ - 为什么 ifstream::read 比使用迭代器快得多?

事实上,有很多方法可以将文件读入字符串。两个常见的是使用ifstream::read直接读取字符串,以及使用steambuf_iterators和std::copy_n:使用ifstream::read:std::ifstreamin{"./filename.txt"};std::stringcontents;in.seekg(0,in.end);contents.resize(in.tellg());in.seekg(0,in.beg);in.read(&contents[0],contents.size());使用std::copy_n:std::ifstreamin{"./fil

c++ - 前向迭代器的多遍保证强度

考虑标准中前向迭代器的定义(草案n4659,[forward.iterators]/27.2.5):AclassorpointertypeXsatisfiestherequirementsofaforwarditeratorifXsatisfiestherequirementsofaninputiterator(27.2.3),XsatisfiestheDefaultConstructiblerequirements(20.5.3.1),IfXisamutableiterator,referenceisareferencetoT;ifXisaconstantiterator,refer

c++ - 为什么 gcc-4.9.2 不支持 std::string.insert(iterator, range) 返回迭代器

根据cppreference,C++11应该支持:templateiteratorinsert(const_iteratorpos,InputItfirst,InputItlast);但是当我尝试使用g++4.9.2编译以下代码时:std::stringstr{"helloworld"},addition{"hmy"};autoiter=str.erase(str.begin(),str.begin()+4);iter=str.insert(next(iter),addition.begin(),addition.end());//Error我收到以下错误(liveexample):e

c++ - 测试 C++ 迭代器

我正在为自定义数组类型编写C++RandomAccessIterator。由于它不适用于std::sort和一个简单的int数组,我想确保我已正确实现它。Doyouknowofany"iteratorconformancetesting"frameworkoutthere?我已经实现了所有可能的函数或operator,一切似乎都是正确的,但我仍然遗漏了一些东西,因为sort()取消了对array::end()的引用 最佳答案 Boost.Iterator-库包含用于概念检查的类。 关于c

c++ - 包装 STL vector 并更改其迭代器的行为

有这样的代码:#include#includetemplateclassA{public:classiterator:publicstd::vector::iterator{public:T&operator*(){??}};iteratorbegin(){returnv.begin();//error}iteratorend(){returnv.end();//error}voidadd(constT&elem){v.push_back(elem);}private:std::vectorv;};intmain(){Aa;a.add(2);a.add(4);for(A::iterat