当前位置: 首页 > 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;
}

http://www.lryc.cn/news/415064.html

相关文章:

  • Java 属性拷贝 三种实现方式
  • Java-变量,运算符,输入与输出
  • 五、一个quad同时支持pcie和sfp两种高速接口的ref时钟配置
  • AI辅助教育:九章大模型的数学辅导功能解析
  • 力扣刷题之3128.直角三角形
  • OD C卷 - 机场航班调度
  • uni-app中使用支付宝扫码插件并且在真机调试时使用(详细教程)
  • 每日学术速递8.5—1
  • 1、操作系统相关概念
  • 【ModelSim】仿真问题记录
  • 如何提高深度学习中数据运行的稳定性
  • 【连续数组】python刷题记录
  • JavaScript青少年简明教程:DOM和CSS简介
  • 架构师知识梳理(一):计算机硬件
  • 从根儿上学习spring 四 之run方法启动第一段
  • 智能闹钟如何判断用户已经醒了?
  • 【算法】动态规划解决背包问题
  • day09 工作日报表
  • C++学习之路(1)— 第一个HelloWorld程序
  • python3 pyside6图形库学习笔记及实践(三)
  • 03 库的操作
  • 嵌入式人工智能(44-基于树莓派4B的扩展板-LED按键数码管TM1638)
  • linux通过抓包工具tcpdump查看80端口访问量情况
  • Mac 上安装和卸载 SDKMAN 及管理多个 JDK
  • 字节测开一面面经
  • HTML 段落
  • 【Mind+】掌控板入门教程04 迷你动画片
  • 文件上传漏洞-HackBar使用
  • 鸿蒙媒体开发【相机数据采集保存】音频和视频
  • 【java基础】徒手写Hello, World!程序