首页 > 编程语言 >c++数据结构之vector

c++数据结构之vector

时间:2022-12-02 16:00:13浏览次数:64  
标签:begin 元素 iter v1 vector c++ 数据结构 vec


文章目录

  • ​​1.关于vector​​
  • ​​2.定义、初始化​​
  • ​​3.插入元素​​
  • ​​4.删除元素​​
  • ​​5.遍历元素​​
  • ​​6.翻转和排序​​
  • ​​7.注意问题​​
  • ​​7.1删除元素​​
  • ​​7.2增加元素​​

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
vector< vector<int> > vec2(8, vector<int> (8, 0)); //初始化二维数组
vector<int> dp[5][5]; //初始化二维数组,每个元素为一个vector
vec3.insert(vec3.end(),vec1.begin(),vec1.end()); //insert方法合并两个vector
vector<int> vec; vec.resize(n); // 也可视为一种初始化的方式

3.插入元素

vector<int> vec{1,2,3,4};
vec.push_back(1); //末尾插入 1,2,3,4,1

vector<int>::iterator 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

与之对应的还有emplace_back,push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。​​C++ STL vector添加元素(push_back()和emplace_back())详解​​ 交换两个vector

int x = 1, y=2;
vector<int> v1(10, x);
vector<int> v2(20, y);
v1.swap(v2);
cout << v1.size()<<'\t'<<v2.size()<< endl;
20 10
  • 泛型swap释放vector的内存
  • 因pop_back()和erase删除导致的占用空间
vector<int> v1(10, x);
v1.pop_back();
cout << v1.size() << '\t' << v1.capacity() << endl;
vector<int>(v1).swap(v1);
cout << v1.size()<<'\t'<<v1.capacity()<< endl;
v1.erase(v1.begin());
cout << v1.size() << '\t' << v1.capacity() << endl;
vector<int>(v1).swap(v1);
cout << v1.size() << '\t' << v1.capacity() << endl;

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.遍历元素

  • 迭代器
  • 索引
  • for range

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插入元素(数据)详解简单的程序诠释C++ STL算法系列之十五:swap


标签:begin,元素,iter,v1,vector,c++,数据结构,vec
From: https://blog.51cto.com/u_15899958/5907122

相关文章

  • Python3 数据结构
    Python处理大数据集可以借助Python内置数据结构:列表、元组、字典、集合等,但是一般要和pandas和Numpy等库结合起来使用。熟练掌握Python,首先就是熟练掌握Python的数......
  • OpenCV4之C++入门详解
    OpenCV4之C++入门详解1、VisualStudio安装及环境配置与搭建1.下载地址:https://my.visualstudio.com/Downloads?q=Visual,下载后按照说明安装即可登录账号下载即可,建议下......
  • C++ 设计一个类模板,有数据成员T data[size],有求最大值的方法getMax()和排序的方法sort
    #include<iostream>#include<string>usingnamespacestd;template<typenameT,intsize>classData{Tdata[size];public:Data(){cout<<......
  • Hbase系统架构及数据结构
    Hbase系统架构及数据结构一、基本概念    1.1RowKey(行键)    1.2ColumnFamily(列族)    1.3ColumnQualifier(列限定符)    1.4Column(列)......
  • C++Primer 第4章
    第4章表达式C++语言提供了一套丰富的运算符,并定义了这些运算符作用于内置类型的运算对象时所执行的操作。同时,当运算对象是类类型时,C++语言也允许由用户指定上述运算符的......
  • 输出10个数中只出现一次的数的个数c++实现
    题目描述针对一个可能含有重复整数出现的一维整数数组【10个元素】,请输出只出现过一次的整数元素的数目。输入31637575894729108931输出4样例输入Copy)3......
  • jsoncpp serialize class in vector
    //Book.h#include<iostream>#include<jsoncpp/json/json.h>usingnamespacestd;classBook{public:intIdx;unsignedlonglongId;char*Name......
  • 1.C++入门基础(上)
    2022-04-29-摘要C++关键字命名空间缺省参数函数重载extern“C”引用总结目录目录2022-04-29-摘要总结目录C++关键字命名空间命名空间定义命名空间的使用指定......
  • 1.C++入门基础(上)
    2022-04-29-摘要C++关键字命名空间缺省参数函数重载extern“C”引用总结目录目录2022-04-29-摘要总结目录C++关键字命名空间命名空间定义命名空间的使用指定......
  • vc++6.0设置字体
    vc++6.0设置字体   如上图,在注册表上找到这个位置.自已设置FontFace和FontSize即可.计算机\HKEY_CURRENT_USER\Software\Microsoft\Devstudio\6.0\Format\Sour......