当前位置: 首页 > news >正文

C++ vector的基本使用(待补全)

 

std::vector 是C++标准模板库(STL)中的一个非常重要的容器类,它提供了一种动态数组的功能。能够存储相同类型的元素序列,并且可以自动管理存储空间的大小,以适应序列大小变化,处理元素集合的时候很灵活

 1. vector的定义

构造函数声明接口说明
vector();无参构造
vector( size_t n, const value_type& val = value_type());构造并初始化n个val
vector(const vector& x);拷贝构造
vector(InputIterator first, InputIterator last);使用迭代器进行初始化构造

 代码如下

#include<iostream>
#include<vector>
//using namespace std;
using std::vector;
using namespace std;
int main()
{vector<int> v1;for (size_t i = 0; i < v1.size(); i++){cout << v1[i] << "  ";}cout << endl;vector<int> v2(10);vector<int> v3(10, 6);for (size_t i = 0; i < v2.size(); i++){cout << v2[i] << "," << v3[i] << "    ";}cout << endl;vector<int> v4(v2);for (size_t i = 0; i < v4.size(); i++){cout << v4[i] << "  ";}cout << endl;vector<int> v5(v3.begin(), v3.begin() + 2);for (size_t i = 0; i < v5.size(); i++){cout << v5[i] << "  ";}cout << endl;
}

其中v1是无参默认构造, v2是利用了缺省值全初始化为0,v3是初始化n个 6,v4是用v2进行拷贝构造,v5则是利用迭代器进行构造

输出结果如下

 2. 迭代器iterator的使用

iterator的使用接口说明
begin+end获取第一个位置数据的iterator/const_iterator,获取最后一个数据的下一个位置的iterator/const_iterator
rbegin+rend获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterator 

如下图所示

 使用代码如下

#include<iostream>
#include<vector>
//using namespace std;
using namespace std;
int main()
{vector<int> v(10,6);v.push_back(1);//vector<int>::iterator it = v.begin();auto it = v.begin();while (it != v.end()){cout << *it << "  ";it++;}cout << endl;vector<int>::reverse_iterator iv = v.rbegin();while (iv != v.rend()){cout << *iv << "  ";iv++;}cout << endl;
}

输出结果如下

 使用iterator不可以vector::iterator it = v.begin();  因为vector是一个模板类需要指定其存储元素的类型。直接写没指定vector具体类型,编译器不知道就会报错(比如可能是vector<double>,vector<int>等)。当然也可以直接用auto自动识别。

3. vector空间增长问题

成员函数接口说明
size获取数据个数
capacity获取容量大小
empty判断是否为空
resize改变vector的元素个数(size)
reserve改变vector的容量(capacity)
(1). size与capacity

用以下代码验证vector动态增长

#include<iostream>
#include<vector>
//using namespace std;
using namespace std;
int main()
{vector<int> v;size_t sz = v.capacity();cout << "容量为:" << sz << endl;cout << "元素个数:" << v.size() << endl;for (int i = 0; i < 100; i++){v.push_back(i);if (sz != v.capacity()){sz = v.capacity();cout << "当前容量:" << sz << endl;cout << "当前元素个数:" << v.size() << endl;}}
}

输出结果为下图

 通过上图我们不难发现,在vs中运行每次增长1.5倍,向上取整

而g++下运行每次增长2倍,并不是所有的vector增容都是增长1.5倍或2倍的。具体增长是多少是看具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。

(2). empty与resize与reserve

reserve只负责开辟空间,如果确定要用多少空间,reserve可以缓解vector增容的代价缺陷问题。只影响capacity(),不影响size()

resize在开空间时还会进行初始化,会影响capacity()还会影响size()

 如以下代码

#include<iostream>
#include<vector>
//using namespace std;
using namespace std;
int main()
{vector<int> v1;size_t sz = v1.capacity();cout << "v1容量为:" << sz << endl;cout << "v1元素个数:" << v1.size() << endl;if(v1.empty()){v1.reserve(100);}for (int i = 0; i < 100; i++){v1.push_back(i);if (sz != v1.capacity()){sz = v1.capacity();cout << "v1当前容量:" << sz << endl;cout << "v1当前元素个数:" << v1.size() << endl;}}vector<int> v2;cout << "v2容量为:" << v2.capacity() << endl;cout << "v2元素个数:" << v2.size() << endl;v2.resize(10);cout << "v2当前容量为:" << v2.capacity() << endl;cout << "v2当前元素个数为:" << v2.size() << endl;for (int i = 0; i < v2.size(); i++){cout << v2[i] << "  ";}cout << endl;vector<int> v3;cout << "v3容量为:" << v3.capacity() << endl;cout << "v3元素个数:" << v3.size() << endl;v3.resize(10, 3);cout << "v3当前容量为:" << v3.capacity() << endl;cout << "v3当前元素个数为:" << v3.size() << endl;for (int i = 0; i < v3.size(); i++){cout << v3[i] << "  ";}cout << endl;
}

输出结果为下图所示

 可以验证我们以上说法

4. vector的增删查改

vector的元素操作接口说明
push_back尾插
pop_back尾删
find查找(算法模块实现,不是vector成员接口)
insert在position(指定坐标)之前插入val
erase删除position(指定坐标)位置的数据
swap交换两个vector的数据空间
operator[]重载运算符,使其能像数组一样访问

//#include<iostream>
//#include<vector>
using namespace std;
//using std::vector;
//using namespace std;
//int main()
//{
//    vector<int> v1;
//    for (size_t i = 0; i < v1.size(); i++)
//    {
//        cout << v1[i] << "  ";
//    }
//    cout << endl;
//    vector<int> v2(10);
//    vector<int> v3(10, 6);
//    for (size_t i = 0; i < v2.size(); i++)
//    {
//        cout << v2[i] << "," << v3[i] << "    ";
//    }
//    cout << endl;
//    vector<int> v4(v2);
//    for (size_t i = 0; i < v4.size(); i++)
//    {
//        cout << v4[i] << "  ";
//    }
//    cout << endl;
//
//    vector<int> v5(v3.begin(), v3.begin() + 2);
//    for (size_t i = 0; i < v5.size(); i++)
//    {
//        cout << v5[i] << "  ";
//    }
//    cout << endl;
//}

//#include<iostream>
//#include<vector>
using namespace std;
//using namespace std;
//int main()
//{
//    vector<int> v(10,6);
//    v.push_back(1);
//    //vector<int>::iterator it = v.begin();
//    auto it = v.begin();
//    while (it != v.end())
//    {
//        cout << *it << "  ";
//        it++;
//    }
//    cout << endl;
//    vector<int>::reverse_iterator iv = v.rbegin();
//    while (iv != v.rend())
//    {
//        cout << *iv << "  ";
//        iv++;
//    }
//    cout << endl;
//}

//#include<iostream>
//#include<vector>
using namespace std;
//using namespace std;
//int main()
//{
//    vector<int> v;
//    size_t sz = v.capacity();
//    cout << "容量为:" << sz << endl;
//    cout << "元素个数:" << v.size() << endl;
//    for (int i = 0; i < 100; i++)
//    {
//        v.push_back(i);
//        if (sz != v.capacity())
//        {
//            sz = v.capacity();
//            cout << "当前容量:" << sz << endl;
//            cout << "当前元素个数:" << v.size() << endl;
//        }
//    }
//}


#include<iostream>
#include<vector>
//using namespace std;
using namespace std;
int main()
{
    vector<int> v1;
    size_t sz = v1.capacity();
    cout << "v1容量为:" << sz << endl;
    cout << "v1元素个数:" << v1.size() << endl;
    if(v1.empty())
    {
        v1.reserve(100);
    }
    for (int i = 0; i < 100; i++)
    {
        v1.push_back(i);
        if (sz != v1.capacity())
        {
            sz = v1.capacity();
            cout << "v1当前容量:" << sz << endl;
            cout << "v1当前元素个数:" << v1.size() << endl;
        }
    }
    vector<int> v2;
    cout << "v2容量为:" << v2.capacity() << endl;
    cout << "v2元素个数:" << v2.size() << endl;
    v2.resize(10);
    cout << "v2当前容量为:" << v2.capacity() << endl;
    cout << "v2当前元素个数为:" << v2.size() << endl;
    for (int i = 0; i < v2.size(); i++)
    {
        cout << v2[i] << "  ";
    }
    cout << endl;
    vector<int> v3;
    cout << "v3容量为:" << v3.capacity() << endl;
    cout << "v3元素个数:" << v3.size() << endl;
    v3.resize(10, 3);
    cout << "v3当前容量为:" << v3.capacity() << endl;
    cout << "v3当前元素个数为:" << v3.size() << endl;
    for (int i = 0; i < v3.size(); i++)
    {
        cout << v3[i] << "  ";
    }
    cout << endl;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux Vim教程
  • 探索WebKit之巅:开启现代网页应用的高效与兼容之旅
  • 强化场站网约车管理,共筑安全便捷出行新生态
  • 【C++标准模版库】list的介绍及使用
  • JVM内存的其他相关解释
  • 如何实现ElementUI表单项label的文字提示?
  • 快速体验LLaMA-Factory 私有化部署和高效微调Llama3模型FAQ
  • 【论文笔记】Matching Anything by Segmenting Anything
  • STM32 | ADC+RS485(第十天)
  • 如何在 Next.js 中实现电子邮件验证?
  • 手把手教你如何在宝塔上添加可道云登录页面的ICP备案信息,别跟权威开玩笑。
  • html+css 实现hover边框彩色流动
  • GD32 MCU硬件I2C不可靠不如软件I2C?
  • Linux之文件系统
  • C#中的TCP和UDP
  • 【译】JS基础算法脚本:字符串结尾
  • 2017届校招提前批面试回顾
  • 5、React组件事件详解
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • fetch 从初识到应用
  • KMP算法及优化
  • Making An Indicator With Pure CSS
  • nginx 负载服务器优化
  • pdf文件如何在线转换为jpg图片
  • Python3爬取英雄联盟英雄皮肤大图
  • React Native移动开发实战-3-实现页面间的数据传递
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • yii2权限控制rbac之rule详细讲解
  • 多线程事务回滚
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 聊聊sentinel的DegradeSlot
  • 设计模式(12)迭代器模式(讲解+应用)
  • 算法-插入排序
  • 王永庆:技术创新改变教育未来
  • 线上 python http server profile 实践
  • 移动端 h5开发相关内容总结(三)
  • 再谈express与koa的对比
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #70结构体案例1(导师,学生,成绩)
  • #APPINVENTOR学习记录
  • #QT(串口助手-界面)
  • #控制台大学课堂点名问题_课堂随机点名
  • ( 10 )MySQL中的外键
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (javaweb)Http协议
  • (六)DockerCompose安装与配置
  • (论文阅读30/100)Convolutional Pose Machines
  • (论文阅读40-45)图像描述1