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

C++ —— vector 容器

C++ —— vector 容器

  • 引言
  • vector容器的使用
  • vector容器的嵌套

引言

string只封装了字符数组,而vector容器支持任意类型的数组。
使用vector容器需要包含头文件:#include <vector>
vector类模板的声明:

template<class T, class Alloc = allocator<T>>
class vector{
private:
	T *start_;  // 动态数组的首地址
	T *finish_; // 已使用空间的最后地址
	T *end_; // 动态分配内存块最后的地址
	……
}

在这里插入图片描述
第一个参数填数组的数据类型,第二个模板参数指定分配器,缺省用STL提供的分配器。
STL中,容器和分配器是分开的。分配器是一个用于管理内存的模板类。STL提供的默认分配器叫allocator<T>,用newdelete分配和释放内存。allocator<T>分配器的原理很简单,就是从外面把容器的数据类型T传给它,然后new一个T类型的数组就可以了。

vector容器的使用

直接看示例代码:

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> v; // 创建一个空的vector容器
    cout << "v.capacity() = " << v.capacity() << endl; // v的容量 0
    // 跟string不一样,vector容器容量缺省不会分配任何空间。
    cout << "v.size() = " << v.size() << endl; // v的大小 0

    vector<int> v2(8); // 创建一个元素个数为8的vector容器
    cout << "v2.capacity() = " << v2.capacity() << endl; // v2的容量 8
    cout << "v2.size() = " << v2.size() << endl; // v2的大小 8

    vector<float> v3(4, 10.123); // 创建一个元素个数为4,每个元素值为10的vector容器
    for(int i = 0; i < v3.size(); i++) {
        cout << "v3[" << i << "] = " << v3[i] << endl;
    }

    // 使用统一初始化列表创建容器
    vector<int> v4({1,436,4,7,8,1,43});
    // vector<int> v4 = {1,436,4,7,8,1,43}; // 等同于上面的写法
    for(int i = 0; i < v4.size(); i++) {
        cout << "v4[" << i << "] = " << v4[i] << endl;
    }

    cout << "v4.front() = " << v4.front() << endl; // 返回第一个元素的值
    cout << "v4.back() = " << v4.back() << endl; // 删除最后一个元素,并返回其值
    v4.pop_back(); // 删除最后一个元素
    v4.push_back(666); // 在容器尾部添加一个元素
    cout << "v4.back() = " << v4.back() << endl; // 返回最后一个元素的值
    cout << "v4[4] = " << v4[4] << endl; // 访问下标为4的元素的值
    cout << "v4.at(5) = " << v4.at(5) << endl; // 访问下标为5的元素的值
    v4.insert(v4.begin() + 2, 100); // 在下标为2的位置插入一个元素
    for(int i = 0; i < v4.size(); i++) {
        cout << "v4[" << i << "] = " << v4[i] << endl;
    } // v4 = {1, 436, 100, 4, 7, 8, 1, 666}

    cout << "v4.empty() = " << v4.empty() << endl; // 判断容器是否为空 v4.empty() = 0
    cout << "v4.data() = " << v4.data() << endl; // 返回容器中动态数组的首的地址 v4.data() = 0x560103951f40

    cout << "v4.data()[2] = " << v4.data()[2] << endl; // 访问下标为2的元素的值 100
    cout << "*(v4.dtat() + 1) = " << *(v4.data() + 1) << endl; // 访问下标为1的元素的值 436

    v4.assign(4, 111); // 将容器v4重新赋值为元素个数为4,每个元素值都为111的vector
    for(int i : v4) {
        cout << i << " ";
    } // v4 = {111, 111, 111, 111}
    cout << endl;
    cout << "v4.size() = " << v4.size() << endl; // 输出容器v4的大小 4
    v4.assign({11, 345, 4, 12, 6}); // 将容器v4重新赋值为{1, 2, 3, 4, 5, 6}
    for(int i : v4) {
        cout << i << " ";
    } // v4 = {11, 345, 4, 12, 6}
    cout << endl;

    return 0;
}

vector容器的本质是数组,数组的内存空间连续的。如果在中间插入(删除)元素,要把后面的元素全部往后(前)移动。移动元素的效率是很低的。所以,尽可能不要在vector容器的中间插入和删除元素。

vector容器的嵌套

STL的大部分容器可以相互嵌套,直接看如下代码:

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<vector<int>> vv; // 创建一个容器vv,元素的数据类型为vector<int>
    vector<int> v; // 创建一个容器v,作为vv的元素
    
    v = {1, 2, 3, 4}; // 初始化容器v
    vv.push_back(v); // 将容器v添加到vv中

    v = {134,56,7,76,7,8,7};
    vv.push_back(v);

    v = {123, 123, 123};
    vv.push_back(v);

    for(int i = 0; i <vv.size(); i++) {
        for(int j = 0; j < vv[i].size(); j++) {
            cout << vv[i][j] << " ";
        }
        cout << endl;
    }

    return 0;
}

运行效果如下:

1 2 3 4
134 56 7 76 7 8 7
123 123 123

感谢浏览,一起学习!


http://www.kler.cn/a/518106.html

相关文章:

  • go gin配置air
  • Greenplum临时表未清除导致库龄过高处理
  • Python Matplotlib库:从入门到精通
  • 【Linux探索学习】第二十七弹——信号(一):Linux 信号基础详解
  • 【JavaEE进阶】图书管理系统 - 壹
  • 在 DevOps 实践中,如何构建自动化的持续集成和持续交付(CI/CD)管道,以提高开发和测试效率?
  • 立创开发板入门ESP32C3第八课 修改AI大模型接口为deepseek3接口
  • Redis高阶3-缓存双写一致性
  • 【8】思科IOS AP升级操作
  • 【Flutter】旋转元素(Transform、RotatedBox )
  • 【EI会议推荐】人工智能、电子信息、智能制造、机器人、自动化、控制科学、机械制造等计算机领域多主题可选!
  • STM32 调试小问题记录
  • qsort和std::sort比较函数返回值的说明
  • 《CPython Internals》阅读笔记:p353-p355
  • 正点原子Linux 移植USB Wifi模块MT7601U驱动(上)
  • Android-UI自动化测试环境配置
  • 【C语言算法刷题】第2题 图论 dijkastra
  • PBFT算法
  • ESG报告流程参考
  • 【深度学习】搭建PyTorch神经网络进行气温预测
  • Qt 5.14.2 学习记录 —— 십구 事件
  • 豆包MarsCode 蛇年编程大作战 | 高效开发“蛇年运势预测系统”
  • Effective C++读书笔记——item23(用非成员,非友元函数取代成员函数)
  • Redis实现,分布式Session共享
  • S4 HANA Tax相关的定价过程
  • c#使用log4Net配置日志文件