c++ vector

梦想与她 提交于 2020-02-01 06:06:51

1.关于vector

  • vector数组是一个能存放任意数据类型(类,结构,普通变量类型等)的动态数组,在数据结构中就相当于顺序储存的线性表,寻找元素非常快,但是插入元素的时间却很大(list是一个双向链表,在同一个位置插入大量的数据时速度很快,但是查找的速度就会慢很多)
  • 和普通数组一样可以通过下标索引来进行访问
  • 与其它动态序列容器相比(deques, lists and forward_lists), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起lists和forward_lists统一的迭代器和引用更好。
  • 缺点:当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。(比普通的数组具有更高的时间复杂度和空间复杂度)

2.定义、初始化

几种定义核初始化的方法:

vector<int> vec;        //声明一个int型向量
vector<int> vec1(4,1);   //vec1的内容为1,1,1,1
vector<int> vec2{ 1, 2, 3, 4, 5}; //vec2为1,2,3,4,5
vector<int> vec3(vec1); //也可以直接用vec3=vec1定义
vector<int> vec4(arr, arr + 5); //将arr数组的元素用于初始化vec向量
vector<int> vec5(arr,&arr[4]); //1,2,3,4

3.插入元素

vector<int> vec{1,2,3,4};
vec.push_back(1); //末尾插入 1,2,3,4,1
vector<int>::iterator it; // 定义一个迭代器
it = vec.begin(); 
vec.insert(it,2,5); //在第一个元素前插入2个5
vec.assign(2, 5); // 清除元素,然后插入2个5

使用emplace插入元素,对象会在容器中直接生成,而不是先单独生成对象,然后再把它作为参数传入。

vector<int> vec{1,2,3,4};
auto iter = vec.emplace(++begin(vec),5);
vec.emplace(++iter, 6); // 1,5,6,2,3,4

4.删除元素

vector<int> vec{1,2,3,4};
vec.pop_back(); //删除最后一个元素
vector<int>::iterator it;
it = vec.begin();
vec.erase(it); //删除迭代器指向的元素
vec.clear() // 清除所有元素
vec.empty() // 判断是否为空

5.遍历元素

vector<int> vec{1,2,3,4};
for(int i:vec){
        cout<<i;
    }

vector<int>::iterator it;
for(it=a.begin(); it!=a.end(); it++)
{
    cout<<*it;
}

6.翻转和排序

vector<int> vec{1,2,3,4};
reverse(vec.begin(), vec.end()); //元素翻转
sort(vec.begin(), vec.end()); //采用的是从小到大的排序
bool Comp(const int& a, const int& b) {
    return a > b;
}
sort(vec.begin(), vec.end(), Comp); //自定义排序函数

7.注意问题

在使用迭代器删除和添加元素时要注意迭代器的变化。

7.1删除元素

当使用erase删除元素时,返回的迭代器指向被删除元素的下一个元素。

vector<int> vec{1,2,3,4};
auto iter = vec.begin();
for(;iter!=vec.end();){
    if(true){
        iter = vec.erase(iter);
    }
} // 返回的vector为空

这里我们可能就想问,vector是否支持vec.erase(iter++),需要注意,这种写法对vector、deque等容器无效!

7.2增加元素

在下面vec的每个元素前插入数字8

vector<int> vec{1,2,3,4};
auto iter = vec.begin();
for(;iter!=vec.end();){
    iter = vec.insert(iter, 8);
    iter++;
    iter++;
} //8,1,8,2,8,3,8,4

参考
c++ vector数组的使用
C++ vector插入元素(数据)详解

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!