2.3.1 引入

vector 容器
动态数组 可变数组
vector容器 单口容器(尾部操作效率高)

vector动态增长基本原理:
当插入新元素时,如果空间不足,那么vector会重新申请更大的一块内存空间,将原空间数据拷贝到新空间,释放旧空间的数据,再把新元素插入新申请空间。

API理论用法详解见vector容器常用API操作


2.3.2 代码实例

#include<iostream>
#include<vector>
using namespace std; void printv(vector<int> v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
} //初始化
void text01()
{
vector<int> v1;//默认构造 int arr[] = { 10,20,30,40,50 };
vector<int> v2(arr, arr + sizeof(arr) / sizeof(arr[0]));
vector<int>v3(v2.begin(), v2.end());
vector<int> v4(v3); printv(v1);
printv(v2);
printv(v3);
printv(v4);
} //常用赋值操作
void text02()
{
int arr[] = { 10,20,30,40,50 };
vector<int> v11(arr, arr + sizeof(arr) / sizeof(int));
//成员方法
vector<int> v2;
v2.assign(v11.begin(), v11.end()); //重载=
vector<int> v3;
v3 = v2; int arr1[] = { 100,200,300,400 };
vector<int> v4(arr1, arr1 + sizeof(arr1) / sizeof(int)); printv(v11);
printv(v2);
printv(v3);
printv(v4);
cout << "下面是v11,v4交换后-----------------\n"; v4.swap(v11);//交换指针 printv(v11);
printv(v2);
printv(v3);
printv(v4); } //大小操作
void text03()
{
int arr1[] = { 100,200,300,400 };
vector<int> v4(arr1, arr1 + sizeof(arr1) / sizeof(int)); cout << "size: " << v4.size() << endl;
if (v4.empty())
{
cout << "empty\n";
}
else
{
cout << "no empty\n";
}
printv(v4);
v4.resize(2);//比实际小扔掉后面的数据
printv(v4);
v4.resize(6);//比实际大补上默认值
printv(v4);
v4.resize(8,1);//修改默认值
printv(v4); cout << "size: " << v4.size() << endl;//元素个数20
cout <<"capacity"<< v4.capacity() << endl;//容量 100
//容量解决每开辟一个即将溢出的新数据就要申请新空间的问题
} //vector存取数据
void text04()
{
int arr1[] = { 100,200,300,400 };
vector<int> v4(arr1, arr1 + sizeof(arr1) / sizeof(int)); for (int i = 0; i < v4.size(); i++)
{
cout << v4[i] << " ";
}
cout << endl;
for (int i = 0; i < v4.size(); i++)
{
cout << v4.at(i) << " ";//可以抛异常
}
cout << endl; cout << "front:" << v4.front() << endl;
cout << "back:" << v4.back() << endl;
} //插入和删除
void text05()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
//头插法
v.insert(v.begin(), 30);
v.insert(v.end(), 40);
printv(v);
v.insert(v.begin() + 2, 100);//vector支持随机访问
printv(v);
//支持数组小标,一般都支持随机访问
//迭代器可以直接+2 +3 -2 -5操作 //删除
v.erase(v.begin());
printv(v);
v.erase(v.begin() + 1, v.end());
printv(v);
v.clear();
cout << "size:" << v.size() << endl;
} //巧用swap缩减空间
void text06()
{
//vector添加元素 他会自动增长 你删除元素,会自动减少么?
vector<int> v;
for (int i = 0; i <10000; i++)
{
v.push_back(i);
}
cout << "size:" << v.size() << endl;
cout << "capacity:" << v.capacity() << endl<<"-------"; v.resize(10);
cout << "\nsize:" << v.size() << endl;
cout << "capacity:" << v.capacity() << endl; //收缩空间
/*vector<int>(v)匿名对象*/vector<int>(v).swap(v);
//匿名对象[C++之匿名对象解析](https://www.cnblogs.com/cthon/p/9173472.html)
cout << "---------" << endl;
cout << "size:" << v.size() << endl;
cout << "capacity:" << v.capacity() << endl ;
} void text07()
{
//reserve 预留空间 resize 区别
int num = 0;
int* address = NULL;
vector<int> v;
//v.reserve(100000);删掉这一行注释,reserve预留空间,这样只开辟一次空间
for (int i = 0; i < 100000; i++)
{
v.push_back(i);
if (address != &(v[0]))
{
address = &(v[0]);
num++;
}
}
cout <<num<< endl;//申请了30次空间
} int main()
{
cout << "\ntext01\n";
text01();
cout << "\ntext02\n";
text02();
cout << "\ntext03\n";
text03();
cout << "\ntext04\n";
text04();
cout << "\ntext05\n";
text05();
cout << "\ntext06\n";
text06();
cout << "\ntext07\n";
text07();
return 0;
}

2.3.3 运行结果



总结

vector作为STL中比较常用的容器,需要好好掌握。可以参考我专栏的下一篇deque容器讲解deque容器一起记忆。这里推荐一篇对vector有较为细致讲解的文章C++STL详解(三)—— vector的介绍及使用


谢谢阅读(〃’ ▽ '〃)如有纰漏欢迎指出,觉得还不错就点个赞吧。

2.3 C++STL vector容器详解的更多相关文章

  1. C++ STL bitset 容器详解

    C++ STL bitset 容器详解 本篇随笔讲解\(C++STL\)中\(bitset\)容器的用法及常见使用技巧. \(bitset\)容器概论 \(bitset\)容器其实就是个\(01\)串 ...

  2. 跟我一起学STL(2)——vector容器详解

    一.引言 在上一个专题中,我们介绍了STL中的六大组件,其中容器组件是大多数人经常使用的,因为STL容器是把运用最广的数据结构实现出来,所以我们写应用程序时运用的比较多.然而容器又可以序列式容器和关联 ...

  3. STL之vector容器详解

    vector 容器 vector是C++标准模版库(STL,Standard Template Library)中的部分内容.之所以认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单的说: ...

  4. [转]STL之vector容器详解

    vector 容器 vector是C++标准模版库(STL,Standard Template Library)中的部分内容.之所以认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单的说: ...

  5. 2.4 C++STL deque容器详解

    文章目录 2.4.1 引入 2.4.2 代码示例 2.4.3 代码运行结果 2.4.4 具体案例 总结 2.4.1 引入 deque容器类比vector容器来学习. deque为双向开口容器,见下图. ...

  6. 2.7 C++STL list容器详解

    文章目录 2.7.1 引入 2.7.2代码示例 2.7.3代码运行结果 总结 2.7.1 引入 STL list 容器,又称双向链表容器,即该容器的底层是以双向链表的形式实现的.这意味着,list 容 ...

  7. [C++ STL] vector使用详解

    一.vector介绍: vector(向量): 是一种序列式容器,事实上和数组差不多,但它比数组更优越.一般来说数组不能动态拓展,因此在程序运行的时候不是浪费内存,就是造成越界.而vector正好弥补 ...

  8. 2.2 C++STL string容器详解

    文章目录 引言 2.2.1 string的特性 2.2.2 string用法理论 2.2.2.1 string构造函数 2.2.2.2 string赋值操作 2.2.2.3 string取值操作 2. ...

  9. STL bind1st bind2nd详解

    STL bind1st bind2nd详解   先不要被吓到,其实这两个配接器很简单.首先,他们都在头文件<functional>中定义.其次,bind就是绑定的意思,而1st就代表fir ...

随机推荐

  1. 安装Varnish 及遇到的坑

      转自:http://ixdba.blog.51cto.com/2895551/682555   一.安装Varnish Varnish的安装非常简单,下面逐步介绍: 1.安装前的准备  Varni ...

  2. docker错误处理——docker Job for docker.service failed because the control process exited with error code.

    (15条消息) docker Job for docker.service failed because the control process exited with error code._Hel ...

  3. Solution -「CF 232E」Quick Tortoise

    \(\mathcal{Description}\)   Link.   在一张 \(n\times m\) 的网格图中有空格 . 和障碍格 #,\(q\) 次询问,每次查询从 \((x_1,y_1)\ ...

  4. VSCode官方的配置同步方案

    前言 这几天在迁移电脑工作环境,对于VSCode,我实在不想从头做下载插件.配置代码规则这样的事情,于是求助百度,搜索结果靠前的解决方案基本都是使用Setings Sync插件,于是我就从了. 经过好 ...

  5. APK修改神器:插桩工具 DexInjector

    本文介绍了一个针对Dex进行插桩的工具,讲解了一下直接修改Dalvik字节码和Dex文件时遇到的问题和解决方法 作者:字节跳动终端技术-- 李言 背景 线下场景中,我们经常需要在APK中插入一些检测代 ...

  6. 关于 Xcode 更新 appleID 更换

    可能不少人会遇到 前一位同事走之后,他的 appID帐号下载的东西更新不了 下面给予大家一个解决办法  例如 Xcode  1.打开引用程序目录 2.找到Xcode,右键"显示包内容&quo ...

  7. Java超全大纲.jpg

    Java超全大纲.jpg

  8. kali各工具使用介绍

    各工具kali官方简介(竖排):https://tools.kali.org/tools-listing 安装kali虚拟机可参考:https://www.cnblogs.com/lsdb/p/650 ...

  9. 网络损伤测试,助力5G新基建

  10. 广州市首批!Smartbi入库信创产品资源池,引领国产BI软件崛起

    为贯彻落实软件高质量发展战略,加快建设有影响力的信息技术创新(简称"信创")资源池,广州市工业和信息化局经征集申报.专家评审.现场考察等多个环节,发布了"广州市信息技术应 ...