C++之动态数组(Vector)中运用各类迭代器
迭代器按照定义分类:
正向迭代器: 容器类名::iterator 迭代器名; 依次向下遍历
反向迭代器: 容器类名::reverse_iterator 迭代器名; 依次向上遍历
常量正向迭代器: 容器类名::const_iterator 迭代器名;
常量反向迭代器: 容器类名::const_reverse_iterator 迭代器名;-------------------------------------------------------------------------------------------------------------------------
迭代器按照功能分类:
正向迭代器,支持相互赋值、比较、自加、取内容等
双向迭代器,具有正向迭代器全部功能,支持自减
随机访问寄存器,具有双向迭代器的全部功能
不同容器的迭代器的功能:
随机访问寄存器 vector、deque
双向寄存器 list、set /multiset、map /multimap
不支持迭代器寄存器 stack、queue、priority_queue
v.end(): 指向向量最后一个元素之后的元素,一般用于正向迭代器 v.rend(): 指向向量第一个元素之前的元素,一般用于反向迭代器 v.begin(): 返回一个指向向量第一个元素的迭代器,用于正向输出动态数组中的元素 v.rbegin(): 返回一个指向向量最后一个元素的反向迭代器,用于逆向输出动态数组中的元素 v.front(): 引用容器的第一个元素 v.assign(first,last): 新值替换旧值,定义了范围,first与last之间被替代 v.assign(n,val): 给指定容器v分配了n次val值,从容器头开始替代 v.erase(pos): 删除迭代器指向pos位置的指定元素 v.erase(first,last): 删除容器first与last之间的内容 v.emplace(pos,val): 在容器的pos位置处插入一个新元素val v.capacity(): 返回容器大小 v1.crbegin(): 同rbegin(),只是适用于常量迭代器,不能被修改 v1.crend()、v1.cend()、v1.cbegin()类似 v.clear(): 清空容器 v.hypot(): 返回两个数的平方和的平方根 v.push_back(val): 在容器末尾插入val v.pop_back(): 删除容器末尾的元素 v.insert(pos,val): 在pos处插入元素val v.insert(pos,n,val): 在pos处连续插入n次元素val v.insert(pos,first,last): 在pos处连续插入first-last之间的内容,可用于容器拼接 v.swap(v1): 交换容器 v 和 v1 里面的内容 v.resize(n): 重置容器大小,一般是用于缩小容器容量 v.resize(n,val): 重置容器大小,一般用于扩大容器容量,并将无元素的位置插入val值 v.data(): 返回一个指向向量内部用于存储其元素的数组的指针
其余方法和list很多相似,详见请看: C++之链表list的方法总结_承诺$枷锁的博客-CSDN博客
#include <iostream> #include <vector> #include <cmath> using namespace std; int main() { //定义动态数组 vector<string> v{"hello","vector","string"}; //vector<int> v(100); //定义正向迭代器 vector<string>::iterator it; //定义反向迭代器 vector<string>::reverse_iterator rit; for(it=v.begin();it!=v.end();++it){ cout<<*it<<" "; //结果:hello vector string } cout<<endl; for(rit=v.rbegin();rit!=v.rend();++rit){ cout<<*rit<<" "; //string vector hello } cout<<endl; string str ("this string erase."); str.erase(4,7); //删除字符串str中从下标为4开始连续删除7个 cout<<str<<endl; //this erase. //删除动态数组中首元素,并打印删除后迭代器的指向 cout<<*(v.erase(v.begin()))<<endl; //vector,这里无循环,所以只打印现有的首地址元素 //删除字符串里面下文两者之间的内容 str.erase(str.begin()+5,str.end()-6); cout<<str<<endl; //this erase. //引用容器第一个元素 cout<<v.front()<<endl; //vector //引用容器最后一个元素 cout<<v.back()<<endl; //string vector<string> v1; cout<<"================="<<endl; //将容器 v 中的数据全部赋给容器 v1 v1.assign(v.begin(),v.end()); for(int i=0;i<v.size();i++) cout<<v1[i]<<" "; //vector string cout<<endl; cout<<"================="<<endl; //将容器 v1中的数据从头开始的 n 个元素被替代成 c v1.assign(1,"c"); for(int i=0;i<v.size();i++) cout<<v1[i]<<" "; //c string cout<<endl; cout<<"================="<<endl; for(int i=0;i<v.size();i++) cout<<v[i]<<" "; //容器v的元素:vector string cout<<endl; //在容器 v的首位置处插入 hello v.emplace(v.begin(),"hello"); for(int i=0;i<v.size();i++) cout<<v[i]<<" "; //容器v的元素:hello vector string cout<<endl; //返回容器的容量 cout<<"容器v的容量为:"<<v.capacity()<<endl; //3 cout<<"================="<<endl; vector<int> cv{1,2,3}; //同rbegin(),只是适用于常量迭代器,不能被修改 //v1.crend()、v1.cend()、v1.cbegin()类似 vector<int>::const_reverse_iterator crit=cv.crbegin(); //常量反向迭代器 // *crit=5;//assignment of read-only location cout<<*crit<<endl; //不能被修改,所以报错 //清除容器cv内的内容 cv.clear(); //清除常量cv内的内容 cout<<"-------------------"<<endl; for(int i=0;i<cv.size();i++) cout<<cv[i]<<endl; //所以这里东西没有显示 cout<<"================="<<endl; int i=2,j=3,z=4; cout<<"2,3的平方和的平方跟:"<<hypot(i,j)<<endl;; //cmath头文件 cout<<"================="<<endl; for(int i=0;i<v.size();i++) cout<<v[i]<<" "; //打印容器v中的所有元素:hello vector string cout<<endl; //元素 push_back 进栈 v.push_back("push_back"); for(int i=0;i<v.size();i++) cout<<v[i]<<" "; //打印容器v中的所有元素:hello vector string push_back cout<<endl; //出栈 v.pop_back(); for(int i=0;i<v.size();i++) cout<<v[i]<<" "; //打印容器v中的所有元素:hello vector string cout<<endl; //在容器末尾插入 insert v.insert(v.end(),"insert"); //在容器头连续插入两次 two v.insert(v.begin(),2,"two"); for(int i=0;i<v.size();++i) cout<<v[i]<<" "; //打印容器v中的所有元素:two two hello vector string insert cout<<endl; for(int i=0;i<v1.size();++i) cout<<"容器v1:"<<v1[i]<<" "; //打印容器v1中的所有元素: 容器v1:c cout<<endl; //将容器 v1 里面的内容追加到容器 v 中 v.insert(v.end(),v1.begin(),v1.end()); for(int i=0;i<v.size();i++) cout<<v[i]<<" "; //打印容器v中的所有元素:two two hello vector string insert c cout<<endl; //交换两个容器里面的内容 v.swap(v1); cout<<"容器v:"; for(int i=0;i<v.size();++i) cout<<v[i]<<" "; //交换容器内容后打印容器 v 的内容: 容器v:c cout<<endl; cout<<"容器v1:"; for(int i=0;i<v1.size();++i) cout<<v1[i]<<" "; //容器v1:two two hello vector string insert c cout<<endl; //缩小容器 v1 的容量 v1.resize(6); cout<<"容器v1:"; for(int i=0;i<v1.size();++i) cout<<v1[i]<<" "; //容器v1:two two hello vector string insert cout<<endl; //扩大容器 v 的容量,并填充 hello v.resize(3,"hello"); cout<<"容器v:"; for(int i=0;i<v.size();++i) cout<<v[i]<<" "; //容器v:c hello hello cout<<endl; //返回一个指向容器 v 内部用于存储其元素的数组的指针 string *p = v.data(); for(int i=0;i<v.size();++i) cout<<*p++<<" "; //c hello hello cout<<endl; }
v.erase():删除迭代器指向的指定元素
erase函数的原型如下:
1)string& erase(size_t pos = 0, size_t n = npos);
erase(pos,n); 删除从pos开始的n个字符
2)iterator erase(iterator position);
erase(position); 删除position处的一个元素
3)iterator erase(iterator first, iterator last);
erase(first,last); 删除从first到last之间的字符(first和last都是迭代器)string str ("this string erase."); str.erase(4,7); cout<<str<<endl; //删除动态数组中首元素,并打印删除后迭代器的指向 cout<<*(v.erase(v.begin()))<<endl; //删除字符串里面下文两者之间的内容 str.erase(str.begin()+5,str.end()-6); cout<<str<<endl;
this erase. vector this erase.
v.assign():为向量分配新值并替换旧值
assign函数原型如下:
assign(Iterator first,Iterator last);给容器定义了范围,first与last之间被替代,可用于容器给容器赋值
举例:v.assign(first,last);assign(size_type n,const value_type& val); 从容器v头部开始,替代n次val值
举例:v.assign(n,val);//次数,分配值vector<string> v1; cout<<"================="<<endl; //将容器 v 中的数据全部赋给容器 v1 v1.assign(v.begin(),v.end()); for(int i=0;i<v.size();i++) cout<<v1[i]<<endl; cout<<"================="<<endl; //将容器 v1中的数据从头开始的 n 个元素被替代成 c v1.assign(1,"c"); for(int i=0;i<v.size();i++) cout<<v1[i]<<endl;
================= vector string ================= c string