C++之动态数组(Vector)中运用各类迭代器

迭代器按照定义分类:

正向迭代器:    容器类名::iterator  迭代器名;        依次向下遍历
反向迭代器:    容器类名::reverse_iterator  迭代器名;    依次向上遍历
常量正向迭代器:    容器类名::const_iterator  迭代器名;
常量反向迭代器:    容器类名::const_reverse_iterator  迭代器名;

-------------------------------------------------------------------------------------------------------------------------

迭代器按照功能分类:

正向迭代器,支持相互赋值、比较、自加、取内容等

双向迭代器,具有正向迭代器全部功能,支持自减

随机访问寄存器,具有双向迭代器的全部功能

不同容器的迭代器的功能: 

随机访问寄存器                        vector、deque

双向寄存器                                list、set /multiset、map /multimap

不支持迭代器寄存器                 stack、queue、priority_queue

C++迭代器(STL迭代器)iterator详解 (biancheng.net)

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
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值