• STL序列容器之vector


    一,vector容器简介

    1.vector容器的原理

      vector是将元素置于一个动态数组中加以管理的容器。

    2.vector容器的特点

      vector容器可以随机存取元素,支持索引存取(即用数组下标的方式存取)。vector容器在尾部插入和删除数据比较快,但是在中部或者头部插入或者删除元素比较费时。

    3.vector容器的使用

      vector容器对应得头文件:# include<vector>

    二,vector容器的构造函数

    1.vector的无参构造函数

    // 定义一个存放int类型的向量容器
    vector<int> v1;
    // 定义存放一个double类型的向量容器
    vector<double> v2;
    // 定义一个存放string类型的向量容器
    vector<string> v3;
    // 定义一个存放自定义类型的向量容器,该类型必须提供拷贝构造函数,因为容器的存放是按值复制的方式
    vector<Student> v4;

    2.vector的有参构造函数

    // 使用数组初始化vector
    int array[] = { 1,2,3,4,5,6,7,8,9 };
    vector<int> v1(array, array + 5);
    // 使用vector初始化vector
    vector<int> v2(v1.begin(), v1.begin() + 3);
    // 使用n个相同的元素初始化vector
    vector<char> v3(10, 'A');

    3.vector的拷贝构造函数

    // 使用n个相同的元素初始化vector
    vector<char> v1(10, 'A');
    // 拷贝构造函数
    vector<char> v2 = v1;

    4.vector的析构函数

      vector的析构函数和用来释放容器中元素所占用的内存。

    三,操作符重载函数

    1.赋值操作符

    // 定义向量v1
    vector<char> v1(10, 'A');
    // 定义向量v2
    vector<char> v2;
    // 赋值操作符重载
    v2 = v1;

    2.数组下标操作符

    // 创建vector容器
    vector<char> v;
    // 添加元素到vector中
    v.push_back('A');
    v.push_back('B');
    v.push_back('C');
    v.push_back('D');
    // 获取第二个元素
    char c2 = v[2];
    // 修改第二个元素
    v[2] = 'X';

    四,成员函数

    1.vector的尾部添加和尾部删除操作

    // vector的尾部添加元素
    vector<char> v1;
    v1.push_back('A');
    v1.push_back('B');
    v1.push_back('C');
    v1.push_back('D');
    // vector的尾部删除元素
    v1.pop_back();
    v1.pop_back();

    2.vector获取头部和尾部元素

    // 创建vector容器
    vector<char> v1;
    // 往vector插入元素
    v1.push_back('A');
    v1.push_back('B');
    v1.push_back('C');
    v1.push_back('D');
    // 获取vector的头元素和尾部元素
    char first = v1.front();
    char last = v1.back();

    3.vector的长度

    // 定义vector容器
    vector<int> v1(10,1);
    // 获取vector的长度
    int v1_size = v1.size();

    4.vector是否为空及清空元素操作

    // 创建vector容器
    vector<int> v1(10,1);
    // 判断vector容器是否为空
    bool isEmpty = v2.empty();
    // vector容器的元素清空
    v2.clear();

    5.vector元素的获取和修改

    // 创建vector容器
    vector<char> v;
    // 添加元素到vector中
    v.push_back('A');
    v.push_back('B');
    v.push_back('C');
    v.push_back('D');
    // 获取第二个元素
    char c2 = v[2];
    // 获取第三个元素
    char c3 = v.at(3);
    // 修改第二个元素
    v[2] = 'X';

    6.vector的遍历

    // 创建vector容器
    vector<int> v1(10,2);
    // 增强for遍历
    for (int tmp : v1)
    {
        cout << tmp << " ";
    }
    cout << endl;
    // 迭代器正向遍历
    for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
    {
        *it += 1;
        cout << *it << " ";
    }
    cout << endl;
    // 迭代器逆向遍历
    for (vector<int>::reverse_iterator it = v1.rbegin(); it != v1.rend(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;

    7.vector的插入

    // 创建vector容器
    vector<char> v(10, 'A');
    // 在vector容器的第二个位置插入字符'X'
    v.insert(v.begin() + 2, 'X');
    // 在vector容器的最后位置插入5个'B'
    v.insert(v.end(), 5, 'B');

    8.vector的删除

    // 创建vector容器
    vector<char> v;
    // 存入数据
    v.push_back('A');
    v.push_back('B');
    v.push_back('C');
    v.push_back('D');
    v.push_back('E');
    // 删除第2个元素
    v.erase(v.begin() + 1);
    // 删除最后两个元素
    v.erase(v.end() - 2, v.end());

    9.vector的遍历删除

    # include<iostream>
    # include<vector>
    # include<deque>
    
    using namespace std;
    
    int main()
    {
        // 定义容器
        vector<int> v;
        // 添加数据
        v.push_back(1);
        v.push_back(2);
        v.push_back(3);
        v.push_back(4);
        v.push_back(5);
        v.push_back(6);
        // 这里注意不需要++it
        for (vector<int>::iterator it = v.begin(); it != v.end();)
        {
            // 删除偶数
            if (*it % 2 == 0)
            {
                // erase删除该元素后返回下一个元素的迭代器
                it = v.erase(it);
            }
            else {
                it++;
            }
        }
        // 遍历
        for (int tmp : v)
        {
            cout << tmp << " ";
        }
        cout << endl;
    
        return 0;
    }

    五,vector容器添加自定义数据类型

    1.定义老师类

    #pragma once
    # include<iostream>
    using namespace std;
    /* 定义老师类 */
    class Teacher
    {
    private:
        char * name;
        int age;
    public:
        Teacher();
        Teacher(char * name, int age);
        /* 如果往容器中存入数据,必须定义拷贝构造函数 */
        Teacher(const Teacher& teacher);
        ~Teacher();
    public:
        friend ostream& operator<<(ostream& out, Teacher& teacher);
    };

    2.老师类的实现

    # define _CRT_SECURE_NO_WARNINGS
    # include<iostream>
    # include"Teacher.h"
    using namespace std;
    /* 无参构造 */
    Teacher::Teacher()
    {
        this->name = NULL;
        this->age = 0;
    }
    /* 有参构造 */
    Teacher::Teacher(char * name, int age)
    {
        this->name = new char[strlen(name)+1];
        strcpy(this->name, name);
        this->age = age;
    }
    /* 拷贝构造函数 */
    Teacher::Teacher(const Teacher& teacher)
    {
        this->name = new char[strlen(teacher.name)+1];
        strcpy(this->name, teacher.name);
        this->age = teacher.age;
    }
    /* 析构函数 */
    Teacher::~Teacher()
    {
        if (this->name != NULL)
        {
            delete [] this->name;
            this->name = NULL;
            this->age = 0;
        }
    }
    /* 友元函数:重载左移操作符 */
    ostream& operator<<(ostream& out, Teacher& teacher)
    {
        cout << teacher.name << " = " << teacher.age;
        return out;
    }

    3.向量容器存入老师对象

    # include<iostream>
    # include<vector>
    # include"Teacher.h"
    using namespace std;
    
    int main()
    {
        // 定义容器
        vector<Teacher> v;
        // 定义5个老师对象
        Teacher t1("刘备", 56);
        Teacher t2("关羽", 45);
        Teacher t3("张飞", 34);
        Teacher t4("赵云", 30);
        Teacher t5("马超", 25);
        // 存入向量容器
        v.push_back(t1);
        v.push_back(t2);
        v.push_back(t3);
        v.push_back(t4);
        v.push_back(t5);
        // 遍历
        for (Teacher t : v)
        {
            cout << t << endl;
        }
    
        return 0;
    }
  • 相关阅读:
    Zotero群组新建后无法显示
    配置vscode的C++环境Unexpected GDB output from command "-environment-cd
    战地5
    virtual studio发布到gihub
    virtual stuido同时调试多个控制台
    js复制标题和链接
    语义理解偶然算法带来的感动
    漂亮的打火机
    雷柏鼠标vt350Q配对
    Unable to open 'free_base.cpp': Unable to read file 'c:Program FilesMicrosoft VS Codeminkernelcrtsucrtsrcappcrtheapfree_base.cpp'
  • 原文地址:https://www.cnblogs.com/metalsteel/p/6294216.html
Copyright © 2020-2023  润新知