草庐IT

c++ - std::list - 迭代器是否在移动时失效?

std::list迭代器有一些非常好的属性——当任何其他元素被移除时,当一个新元素被添加时,甚至当2个列表被交换时,它们仍然有效(Iteratorinvalidationrules)!考虑到以下代码行为,并且迭代器是通过一种指向实际节点的指针形式实现的,当列表移动时它不会改变,我的猜测是迭代器在新容器中仍然有效时std::list已移动,但我也可以通过访问实际上具有“预期”值的无效内存来进入UB区域。std::listl1{3,2,1};std::listl2;autoit=std::prev(l1.end());std::cout如果std::list移动时迭代器仍然有效,是否由标准

c++ - 二叉搜索树中的有序遍历复杂性(使用迭代器)?

相关问题:TimeComplexityofInOrderTreeTraversalofBinaryTreeO(N)?,但是它基于递归遍历(因此在O(logN)空间中),而迭代器只允许消耗O(1)空间。在C++中,通常要求递增标准容器的迭代器是O(1)操作。对于大多数容器来说,它的证明是微不足道的,但是对于map等,它似乎有点困难。如果将map实现为skip-list,那么结果将是显而易见的然而,它们通常被实现为红黑树(或至少作为二叉搜索树)因此,在有序遍历期间,有时“下一个”值不是那么容易达到。例如,如果您指向左子树的右下角叶子,那么下一个要遍历的节点就是根,距离depth步远。我已经

c++ - std::list<>::splice 使迭代器无效。理由?

我想知道制作std::list::splice背后的基本原理是什么使引用被拼接到新容器中的子序列的迭代器无效。这对我来说有点不合逻辑,尤其是考虑到标准std::container::swap规范。根据语言标准std::container::swap不会使任何迭代器失效。这是一个完全合理的实用规范。但是,我会说std::list::splice也会从保留迭代器的行为中受益匪浅。我知道可能有一些基于迭代器可达性等概念的纯学术考虑。但同时splice是std::list-特定操作,这意味着为其提供定制规范可能不会对一般的STL设计造成严重的概念性损害。那是什么?它是否会使std::list的

c++ - 从反向迭代器获取 vector 中的索引

我知道如何从vector迭代器中获取索引,方法是从中减去begin迭代器。例如:vector::iteratorit=find(vec.begin(),vec.end(),x);size_tposition=it-vec.begin();但是,现在我想找到vector中最后一个x的索引。如何从反向迭代器中获取真实索引?我发现以下似乎有效(编辑:无效)但也许有更好的(更惯用的或其他..)方式。vector::reverse_iteratorit=find(vec.rbegin(),vec.rend(),x);size_tposition=vec.size()-(it-vec.rbegin

c++ - 从 Visual Studio 2010 开始,取消引用集合上的迭代器时的 Const 引用

从VisualStudio2010开始,对集合进行迭代似乎会返回一个迭代器,该迭代器将数据取消引用为“const数据”而不是非常量。以下代码是在VisualStudio2005上编译但在2010上编译不了的示例(这是一个人为的示例,但清楚地说明了我们在自己的代码中发现的问题)。在这个例子中,我有一个存储位置和温度的类。我定义了只使用位置而不是温度的比较运算符(不是全部,只是足以说明问题)。关键是,对我来说,如果位置相同,则两个实例是相同的;我不关心温度。#includeclassDataPoint{public:DataPoint(intx,inty):m_x(x),m_y(y),m_

c++ - boost zip 迭代器和 std::sort

我有两个长度相同的数组values和keys。我想使用keys数组作为键对values数组进行按键排序。有人告诉我,boost的zip迭代器是将两个数组锁定在一起并同时对它们执行操作的正确工具。这是我尝试使用boost::zip_iterator来解决无法使用gcc编译的排序问题。有人可以帮我修复这段代码吗?问题出在线路上std::sort(boost::make_zip_iterator(keys,values),boost::make_zip_iterator(keys+N,values+N));#include#include#include#include#include#in

c++ - std::for_each 处理多个迭代器范围

lambda表示法使STL算法更易于访问。我仍在学习决定何时有用以及何时退回到老式的for循环。通常,有必要迭代两个(或更多)相同大小的容器,这样相应的元素是相关的,但由于某种原因没有打包到同一个类中。使用for循环实现的函数如下所示:templatevoidfoo(vector&data,vector&prop){autoi_data=begin(data);autoi_prop=begin(prop);for(;i_data!=data.end();++i_data,++i_prop){if(i_prop->SomePropertySatistfied()){i_data->DoS

c++ - 带有状态分配器的 std::vector::swap() 是否应该使所有迭代器失效?

给定分配器a1和a2,其中a1!=a2,和std::vectorv1(a1)和v2(a2)然后v1.swap(v2)使所有迭代器无效。这是预期的行为吗? 最佳答案 一般来说,swap从不使迭代器无效。然而,当分配器不同时,另一条规则开始发挥作用。在这种情况下,行为取决于allocator_traits::propagate_on_container_swap::value和allocator_traits::propagate_on_container_swap::value.如果两者都为真,则分配器与数据一起交换,所有迭代器仍然有

c++ - ->second 是否为迭代器 my_map.end() 定义?

我正在使用std::map.我想测试是否my_map.find(key)返回一个特定的指针。现在我在做;autoiter=my_map.find(key);if((iter!=my_map.end())&&(iter->second==expected)){//Somethingwonderfulhashappened}然而,operator*迭代器的需要返回一个引用。凭直觉我假设它是有效的并且完全初始化?如果是这样,my_map.end()->second将是NULL,并且(因为NULL从来都不是预期的),我可以将我的if语句减少到:if(iter->second==expected

c++ - 为什么不能将反向迭代器转换为正向迭代器?

嗯,我知道为什么,这是因为没有转化,但为什么没有转化呢?为什么正向迭代器可以变成反向迭代器而不是反过来呢?更重要的是,如果我想这样做,我该怎么办?是否有一些适配器允许您使用前向迭代器向后迭代?std::vectorbuffer(10);std::vector::iteratorforward=buffer.begin();std::vector::reverse_iteratorbackward=buffer.rbegin();++forward;++backward;std::vector::iteratorforwardFromBackward=std::vector::itera