首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么swap()函数不能与向量的迭代器一起工作?

swap()函数不能与向量的迭代器一起工作的原因是,swap()函数在交换两个对象时,会直接交换它们的内存内容,而不是通过迭代器来操作。而向量的迭代器是一种指向容器中元素的指针,当容器的元素被交换时,迭代器指向的元素位置也会发生改变。这样一来,如果在交换过程中使用了迭代器,交换后迭代器指向的位置将不再是原来的元素,而是交换后的元素,导致迭代器失效。

为了解决这个问题,可以使用其他方法来交换向量中的元素,例如使用std::iter_swap()函数,该函数可以通过迭代器来交换元素而不会导致迭代器失效。另外,也可以使用std::swap_ranges()函数来交换两个向量范围内的元素。

需要注意的是,虽然swap()函数不能与向量的迭代器一起工作,但在其他情况下,swap()函数仍然是一个非常高效的交换两个对象的方法,可以用于交换数组、普通变量等。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

STL库基础学习

2.vector迭代 ◦ vector::iterator 为 vector 迭代变量类型,利用迭代,我们可以去直接写入,删除,访问 vector 当中元素,简单地说,迭代可以认为是指向某个元素指针...同样所有支持访问所有元素类模板都有自己迭代。...x ◦ iterator insert(iterator it,const T& x): 向量迭代指向元素前增加一个元素 x 删除函数 ◦ iterator erase(iterator...◦ void pop_back (): 删除向量中最后一个元素 ◦ void clear(): 清空向量中所有元素 迭代函数 ◦ iterator begin(): 返回向量头指针...,但是从底层实现上来看,他本质是一个双向链表,不支持随机去访问当中元素,但是在插入,删除元素时间复杂度上远低于 vector 类模板 ◦ 常用函数与 vector 当中部分相似或相等,这里逐一介绍

83340

STL常用对象,不会搞得C++跟没学一样

key 函数 lower_bound() //返回键值>=给定元素第一个位置 max_size() //返回可以容纳最大元素个数 rbegin() //返回一个指向 map 尾部逆向迭代...rend() //返回一个指向 map 头部逆向迭代 size() //返回 map 中元素个数 swap() //交换两个 map upper_bound() //...)某值第一个元素迭代 set.key_comp()--返回一个用于元素间值比较函数 set.max_size()--返回集合能容纳元素最大限值 set.rbegin()--返回指向集合中最后一个元素反向迭代...set.rend()--返回指向集合中第一个元素反向迭代 set.size()--集合中元素数目 set.swap()--交换两个集合变量 set.upper_bound()--返回大于某个值元素迭代...双向迭代(map multimap set multiset) 组合正向迭代和逆向迭代功能,支持多遍算法 随机访问迭代(vector deque) 组合双向迭代能与直接访问容器中任何元素功能

41020

std::vector初始化

& x):向量迭代指向元素前增加n个相同元素x iterator insert(iterator it,const_iterator first,const_iterator last):向量迭代指向元素前插入另一个相同类型向量...[first,last)间数据 3.删除函数 iterator erase(iterator it):删除向量迭代指向元素 iterator erase(iterator first,iterator...iterator end():返回向量尾指针,指向向量最后一个元素下一个位置 reverse_iterator rbegin():反向迭代,指向最后一个元素 reverse_iterator rend...():反向迭代,指向第一个元素之前位置 5.判断函数 bool empty() const:判断向量是否为空,若为空,则向量中无元素 6.大小函数 int size() const:返回向量中元素个数...int capacity() const:返回当前向量张红所能容纳最大元素值 int max_size() const:返回最大可允许vector元素数量值 7.其他函数 void swap(

84530

【C++】初阶模板

库容器,比如迭代和算法,都是泛型编程例子,它们都使用了模板概念。...每个容器都有一个单一定义,比如 向量,我们可以定义许多不同类型向量,比如 vector 或 vector 。...我们可以使用模板来定义函数和类,接下来让我们一起来看看如何使用。...,就需要我们编写很多Swap交换函数来完成这一功能,如: 仔细观察可以发现,这三个Swap交换函数除了参数类型不同,其余函数逻辑是一模一样,那么有没有一种方法可以简化这种重复又烦琐工作呢...也就是说,函数调用其实是函数模板生成具体函数.由模板生成具体函数这一过程也被称为模板实例化: 在编译编译阶段,对于模板函数使用,编译需要根据传入实参类型来推演生成对应类型函数以供调用

7110

POSIT算法原理–opencv 3D姿态估计

算法正常工作前提是物体在Z轴方向“厚度”远小于其在Z轴方向平均深度,比如距离镜头10米远一张椅子。...为什么不能共面?如果第4个点与前三个点共面,那么该点“齐次坐标”就可以被其他三个点“齐次坐标”线性表示,而迭代方程右侧使用就是齐次坐标,这样由第四个点得到方程就不是独立方程了。...OK,假如我们获得了4个共面的点及其坐标,并通过迭代方程求出了8个未知量。这时我们就可以算出向量sR1和sR2模长。而由于R1和R2本身都是单位向量,即模长为1。...openCV里用cvPOSIT()函数实现POSIT迭代,具体函数用法网上有很多介绍不再重复了。...顺带提一下openCV里另两个函数solvePNP()和cvFindExtrinsicCameraParams2(),这两个函数能与POSIT类似,也是在已知一组点对应图像坐标和世界坐标以及摄像头内参数情况下计算物体

1.3K10

vector使用方法_vector指针如何使用

x iterator insert(iterator it,int n,const T& x):向量迭代指向元素前增加n个相同元素x iterator insert(iterator it,const_iterator...first,const_iterator last):向量迭代指向元素前插入另一个相同类型向量[first,last)间数据 3.删除函数 iterator erase(iterator it...):删除向量迭代指向元素 iterator erase(iterator first,iterator last):删除向量中[first,last)中元素 void pop_back():删除向量中最后一个元素...rbegin():反向迭代,指向最后一个元素 reverse_iterator rend():反向迭代,指向第一个元素之前位置 5.判断函数 bool empty() const:判断向量是否为空...) const:返回最大可允许vector元素数量值 7.其他函数 void swap(vector&):交换两个同类型向量数据 void assign(int n,const T& x):设置向量中前

2.5K20

C++ STL 概述_严丝合缝合作者

迭代:独立于容器,提供访问容器中数据通用操作组件。 算法:提供通用基础算法功能,算法通过迭代对容器中数据进行查找、计算……。 函数对象:重载了括号运算符()模板类,为算法提供灵活策略。...适配器:通过对已有的容器、迭代函数对象进行适配,创造出新编程组件。 配置:为容器服务,负责其内存空间配置与管理。...本文仅俯瞰一下STL,对STL有一个大概了解,对每一个组件细节讨论将留到系列文章中讲解。 下面通过一个简单案例初步了解容器、迭代、算法、函数对象之间合作关系。...STL使用了高内聚、低耦合设计理念,各组件专业能力非常强,合作时又能做到润物细无声。 容器专注于数据存储。 迭代专注于容器访问。 函数对象提供具体算法策略。...end:返回容器尾部数据后一个存储位置迭代。 rbegin:求指向容器反向开始元素迭代。 rend:求容器反向结尾元素后一个存储单元迭代swap:交换两个容器内容。

46820

Rosenblatt感知结构 与基本原理

Rosenblatt感知详解 在学习了机器学习十大算法之后,我决定将目光投向神经网络,从而攀登深度学习高峰。这条险路第一个拦路虎就是Rosenblatt感知为什么这么说呢?...《神经网络与机器学习》中证明并不理想,它忽略了学习率和初始权重向量影响;2)学习率和初始权重向量迭代次数影响是什么?3)它更新过程与梯度下降法如此相似,不禁想问两者之间有何联系?...如图1所示,首先,输入信号每一个分量由突触加权,再与偏置一起由响应求和,之后通过激活函数获得输出。 响应对突触加权后信号和偏置求和,得到响应值: ?...为纪念McCulloch和Pitts(1943)开拓性工作,激活函数为阈值函数神经元也被称为McCulloch-Pitts模型,此时: ? ?...如果我们对Rosenblatt感知构造损失函数 ? ? ? 因此,Rosenblatt感知迭代过程实际上是随机梯度下降法一个简化。

1.6K120

Rosenblatt感知结构 与基本原理

《神经网络与机器学习》中证明并不理想,它忽略了学习率和初始权重向量影响;2)学习率和初始权重向量迭代次数影响是什么?3)它更新过程与梯度下降法如此相似,不禁想问两者之间有何联系?...如图1所示,首先,输入信号每一个分量由突触加权,再与偏置一起由响应求和,之后通过激活函数获得输出。 响应对突触加权后信号和偏置求和,得到响应值: ?...为纪念McCulloch和Pitts(1943)开拓性工作,激活函数为阈值函数神经元也被称为McCulloch-Pitts模型,此时: ? ?...老虎要发威——Rosenblatt感知更新过程 到目前为止,我们了解了Rosenblatt感知工作流程,但还没有解释它如何对于误分类刺激调整权重值。...如果我们对Rosenblatt感知构造损失函数 ? ? ? 因此,Rosenblatt感知迭代过程实际上是随机梯度下降法一个简化。

1.2K20

STL小结

3、迭代具体实现在中,我们完全可以不管迭代类是怎么实现,大多数时候,把它理解为指针是没有问题(指针是迭代一个特例,它也属于迭代),但是,决不能完全这么做。...容器适配器接口更为简单,只是受限比一般容器要多。 迭代适配器:修改为某些基本容器定义迭代接口一种STL组件。反向迭代和插入迭代都属于迭代适配器,迭代适配器扩展了迭代功能。...6、空间配置 STL内存配置在我们实际应用中几乎不用涉及,但它却在STL各种容器背后默默做了大量工作,STL内存配置为容器分配并管理内存。...3、迭代三个辅助函数:advance(),distance(),iter_swap()。       ...advance()可令迭代前进       distance()可处理迭代之间距离。       iter_swap()可交换两个迭代所指内容。

82210

C++:Vector模拟实现

Vector虽然也支持下标访问,但是很多成员函数都是用迭代,所以我们要模拟实现的话迭代十分重要,vs使用是PJ版STL版本,比较难懂,所以我们模拟实现统一用SGI版本去实现,所以在模拟实现之前...思考:为什么迭代也要搞个类模板呢?         答:本质上是为了让这个函数更加灵活,可以传不同类型迭代来帮助我们初始化!!...比如这个地方我们传string类迭代  传vector类迭代  2.1.3 有参构造函数(对n个存储类型去调用他们构造) //有参构造函数(对n个存储类型去调用他们构造) vector(..._end_of_storage); }         拷贝构造现代写法思路:创建一个临时对象利用被拷贝对象迭代区间构造,然后再swap一下就可以了!...  这里博主直接上代码,等list模拟实现时候再放在一起分析 1、利用正向迭代去封装反向迭代 //反向迭代封装 template struct

7510

Signals-The Boost C++ Libraries

在例67.1中,只有具有void()签名函数能与信号s关联。 Lambda函数通过connect()与信号s关联。 因为lambda函数符合所需签名void(),所以成功建立了关联。...该操作符会被两个迭代自动调用,这两个迭代器用于访问与特定信号关联功能。当取消迭代引用时,将调用函数,并且它们返回值在组合中变得可用。...请注意,不可能首先将迭代直接传递到std::min_element(),因为此算法需要正向迭代,而组合则与输入迭代一起使用。...这就是为什么在使用std::min_element()确定最小值之前,使用向量存储所有返回值原因。 例67.9修改了组合,以将所有返回值存储在容器中,而不是对其求值。...它将所有返回值存储在一个向量中,然后由s()返回。

1.2K40

【C++】容器类_容器迭代

()返回指向容器最后一个元素迭代 最后,要介绍是C++中map容器基本用法,也就是很常见key-value对容器。...map末尾迭代 equal_range()返回特殊条目的迭代对 erase()删除一个元素 find()查找一个元素 get_allocator()返回map配置 insert()插入元素...key_comp()返回比较元素key函数 lower_bound()返回键值>=给定元素第一个位置 max_size()返回可以容纳最大元素个数 rbegin()返回一个指向map尾部逆向迭代...rend()返回一个指向map头部逆向迭代 size()返回map中元素个数 swap()交换两个map upper_bound()返回键值>给定元素第一个位置 value_comp...因此仅仅实现一些简单功能,也是要自己去写函数,比较困难。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。

64410

C++STL中vector使用策略(一)

push_back()函数表示将数据添加到vector尾部,并按需分配内存。...= v.end())  {      if(x == *it)//x为要删除值,不是下标      {        /.erase(it);//容器在删除或插入一个元素后,原来迭代会失效      ...() 向量最大容量 v.resize() 更改向量大小 v.capacity() 向量真实大小 v.empty() 向量判空        vector成员函数(修改) 函数 意义 v.assign(...) 多个元素赋值 v.push_back() 末尾添加元素 v.pop_back() 末尾删除元素 v.inser(it,n,x) 在迭代it前面插入n元素x v.erase() 删除当前迭代位置元素...v.swap() 交换两个向量元素 v.clear() 清空向量元素        vector成员函数迭代函数 意义 v.begin() 开始指针 v.end() 末尾指针

65350

C++ vector 容器浅析

vector中2.增加函数void push_back(const T& x):向量尾部增加一个元素Xiterator insert(iterator it,const T& x):向量迭代指向元素前增加一个元素...first,const_iterator last):向量迭代指向元素前插入另一个相同类型向量[first,last)间数据3.删除函数iterator erase(iterator it):...():反向迭代,指向最后一个元素reverse_iterator rend():反向迭代,指向第一个元素之前位置5.判断函数bool empty() const:判断向量是否为空,若为空,则向量中无元素...元素数量值7.其他函数void swap(vector&):交换两个同类型向量数据void assign(int n,const T& x):设置向量中第n个元素值为xvoid assign(const_iterator...:" ; //方法二,使用迭代将容器中数据输出 vector::iterator it;//声明一个迭代,来访问vector容器,作用:遍历或者指向vector容器元素

1.4K20

vector方法和使用

全部初始化为2 vectorvec4(10);//构造大小为10容器 初始化 vec.push_back(6);//从后面插入一个数 for(int i = 0; i < 10; i...//3.迭代: //3.1.遍历 vector::iterator it;//定义迭代变量it //for (vector::iterator it = vec.begin...= vec1.end(); i++)//也可以用auto自动识别类型,begin()返回第一个元素迭代,end() 返回最后一个元素后面位置迭代 (超尾迭代) { cout << *i;...= vec2.rend(); it2++)//反向迭代 { //rbegin  指向最后一个元素位置     返回是反向迭代 //rend()指向最开始元素前面那个位置   ++是从后向前...(10);//为向量指定一个新容量 //12.交换 swap(vec, vec1);//交换两个向量元素 cin.get(); return 0; } bool compare(int a,

89930

有关deque用法讲解 以及 例题

deque容器: 为一个给定类型元素进行线性处理,像向量一样,它能够快速地随机访问任一个元素,并且能够高效地插入和删除容器尾部元素。...间数据 (3) 删除函数 Iterator erase(iterator it):删除双端队列中某一个元素 Iterator erase(iterator first,iterator last):...():返回向量头指针,指向第一个元素 iterator end():返回指向向量中最后一个元素下一个元素指针(包含在向量中) reverse_iterator rbegin():反向迭代,指向最后一个元素...reverse_iterator rend():反向迭代,指向第一个元素前一个元素 (5) 判断函数 bool empty() const:向量是否为空,若true,则向量中无元素 (6) 大小函数...Int size() const:返回向量中元素个数 int max_size() const:返回最大可允许双端对了元素数量值 (7) 其他函数 void swap(deque&):交换两个同类型向量数据

61420

为实习准备数据结构(1)-- 详尽数组篇

我们应该养成使用下面这种迭代访问方式。 vector::iterator it; //初始化一个vector类型迭代 for(it = test.begin();it!...=test.end();it++) //从头遍历到尾 { cout<<*it<<endl; //取出内容 } 关于迭代还需要知道是:vector迭代支持前后向,及重载了 +,—,++,-- 操作...其他swap(test,test2); //交换test和test2中数据 test.resize(20); //重置大小 reverse(test); //元素翻转如果要问为什么没有 “修改数据部分...特别注意: 使用vector需要注意以下几点: 1、如果你要表示向量长度较长(需要为向量内部保存很多数),容易导致内存泄漏,而且效率会很低; 2、Vector作为函数参数或者返回值时,需要注意它写法...但是,需要牢记一点是:对于Vector一切操作,一旦引起空间重新分配,那么指向原有空间迭代将会全部失效。

47500

C++小知识之Vector用法

vector中删除一个元素后,此位置以后元素都需要往前移动一个位置,虽然当前迭代位置没有自动加1,    但是由于后续元素顺次前移,也就相当于迭代自动指向下一个位置一样。...reserve成员函数允许你最小化必须进行重新分配次数,因而可以避免真分配开销和迭代/指针/引用失效。...但在我解释reserve为什么可以那么做之前,让我简要介绍有时候令人困惑四个相关成员函数。在标准容器中,只有vector和string提供了所有这些函数。   ...结尾迭代/指针/引用将失效。   ...该方法只需一条语句:vector(ivec).swap(ivec); 表达式vector(ivec)建立一个临时vector,它是ivec一份拷贝:vector拷贝构造函数做了这个工作

72130
领券