c++ vector详解

vector是一种容器,vector的底层是一个动态数组,里面可以存放各种类型,使用vector时,必须包括头文件 #include
定义vector对象的常用方法:

vector<T> v1;                 v1是一个空的vector,使用的默认构造函数初始化v1
vector<T> v2(V1);             用v1去初始化v2,v2包含了v1内的所有元素(直接初始化)
vector<T> v2=v1;              用v1去初始化v2,v2包含了v1内的所有元素(拷贝初始化)
						     把等号右侧的值直接拷贝到左侧的对象中 。
vector<T> v3(n,val);          v3里面放了n个重复的元素,每一个元素的值都是val
vector<T> v4(n);              v4里面放了n个重复的元素,每一个元素的值都是默认值
vector<T> v5{a,b,c,d};        v5里面放了4个元素,每一个元素的值就是列表里的值(列表初始化),
                              列表初始化的括号是花括号, 而不是圆括号。                                         
vector<T> v5={a,b,c,d};       v6里面放了4个元素,每一个元素的值就是列表里的值

常用的方法:

vector<int> vec;
vec.push_back(1)            将元素1加入到vec的末尾
vec.empty()                 判断vec是否为空,其实是通过判断vec.size()是否为0,为空返回真
vec.size()                  返回vec中元素的个数
vec[i]                      通过下标访问元素
vec=vec2                    用vec2中的元素替换vec中的元素
vec==vec2                   元素个数相同对应位置元素值相同时为真
vec.front()                 返回首元素的引用
vec.back()                  返回尾元素的引用
vec.at(n)                   返回下标n元素的引用
vector<value_type>::iterator iter      定义vec的迭代器,value_type为元素的类型
vec.insert(it,t)            在迭代器it之前插入一个元素t,返回指向新添加的元素的迭代器
vec.insert(it,b,e)        在迭代器it之前插入迭代器b,e之内的元素,返回指向新添加的第一个元素的迭代器
vec.insert(it,n,t)          在迭代器it之前插入n个元素t,返回指向新添加的第一个元素的迭代器
vec.erase(it)               删除it位置的元素,返回指向删除元素后一个元素的迭代器
vec.erase(b,e)           删除b,e之内的元素,返回指向删除元素后一个元素的迭代器
vec.pop_back()         删除尾元素,返回void
vec.clear()                 删除所有元素,返回void
vec.remove(b,e,t)     将要“删除”元素t之后的元素移到t之前,并不是真的删除,容器内元素的个数并未减少。就是将所有值为t的元素移到末尾,返回值为第一个指向值为t的迭代器
vec.resize(n)    将vec的容器大小设为n,注意改变的是size,若原来的大小大于n,原容器末尾的一些元素会被舍弃,若小于,则会填充默认值
vec.capacity()   返回vec的容量大小,即它最多能保存多少个元素,size是当前已经存了多少元素
vec.reserve(n)  将容量改为n,若新容量小于原容量,多余的内存不会释放,若小于,则重新分配

向容器中添加或者删除元素的操作可能使指向容器的指针、引用、迭代器失效。一个失效的指针、引用、迭代器将不再表示任何元素。

在向容器添加元素后,如果储存空间未重新分配,指向插入位置之前的元素的迭代器、指针、引用有效,但指向插入位置之后的将会失效。
在从容器删除元素之后,指向被删元素之前元素的迭代器、引用、指针仍有效。尾后迭代器也就失效。
所以对容器进行操作之后,对迭代器需要更新。

1.遍历时插入元素

    iter=v.insert(iter,*iter);//想要指向下一个元素,就要跳过当前和被添加的元素

    iter+=2;

2. 遍历时删除元素

注意:erase函数返回的就是删除之后的元素的迭代器

  iter=iter.erase(iter);

在这里插入图片描述

当要在访问元素的同时改变元素的值时可以使用:

for(auto &i;vec){    必须加引用,否则不会改变
	i=i+1;
}

迭代器访问:标准库容器都可以使用迭代器,容器中有一个返回迭代器的成员:begin和end,任何添加或者删除容器内的元素都会使end()失效,所以不能用变量保存end()的值,必须在每次使用时不断调用end()函数。注意:迭代器不是指针,是类模板,表现的像指针。

auto b=vec.begin() ,e=vec.end()     b指向第一个元素,注意:e指向尾元素的下一个元素,容器为空时,b==e,指向尾元素的下一个元素

常用运算符:

*iter      返回iter所指元素的引用
iter->men  解引用iter并获取该元素的men成员
++iter    指向iter下一个元素
--iter     指向iter上一个元素
iter1==iter2   判断两个迭代器是否相等
iter1!=iter2

注意++iter和iter的区别:

operator++(){     ++iter
    Part++;    
    return Part;  
}  
  
operator++(int flag){      iter++
    int temp = Part;  
    Part++;    
    return temp;  
} 

iter++需要创建临时变量,它的效率不如++iter。

猜你喜欢

转载自blog.csdn.net/ywh15387127537/article/details/84922331