• Vector容器详解


    Vector容器

    前言

    STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器。

    STL容器就是将运用最广泛的一些数据结构实现出来 常用的数据结构:数组, 链表,树, 栈, 队列, 集合, 映射表 等

    概念

    vector数据结构和数组非常相似,也称为单端数组。

    vector与普通数组区别: 不同之处在于数组是静态空间,而vector可以动态扩展

    动态扩展: 并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间

    vector容器的迭代器是支持随机访问的迭代器

    vector存放内置数据类型

    容器: vector

    算法: for_each

    迭代器: vector::iterator

    #include <vector>
    #include <algorithm>
    void MyPrint(int val)
    {
    cout << val << endl;
    }
    void test01() {
    //创建vector容器对象,并且通过模板参数指定容器中存放的数据的类型
    vector<int> v;
    //向容器中放数据
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    //每一个容器都有自己的迭代器,迭代器是用来遍历容器中的元素
    //v.begin()返回迭代器,这个迭代器指向容器中第一个数据
    //v.end()返回迭代器,这个迭代器指向容器元素的最后一个元素的下一个位置
    //vector<int>::iterator 拿到vector<int>这种容器的迭代器类型
    vector<int>::iterator pBegin = v.begin();
    vector<int>::iterator pEnd = v.end();
    //第一种遍历方式:
    while (pBegin != pEnd) {
    cout << *pBegin << endl;
    pBegin++;
    }
    //第二种遍历方式:
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
    cout << *it << endl;
    }
    cout << endl;
    //第三种遍历方式:
    //使用STL提供标准遍历算法 头文件 algorithm
    for_each(v.begin(), v.end(), MyPrint);
    }
    int main() {
    test01();
    system("pause");
    return 0;
    }
    内置数据类型存放

    Vector存放自定义数据类型

    #include <vector>
    #include <string>
    //自定义数据类型
    class Person {
    public:
    Person(string name, int age) {
    mName = name;
    mAge = age;
    }
    public:
    string mName;
    int mAge;
    };
    //存放对象
    void test01() {
    vector<Person> v;
    //创建数据
    Person p1("aaa", 10);
    Person p2("bbb", 20);
    Person p3("ccc", 30);
    Person p4("ddd", 40);
    Person p5("eee", 50);
    v.push_back(p1);
    v.push_back(p2);
    v.push_back(p3);
    v.push_back(p4);
    v.push_back(p5);
    for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) {
    cout << "Name:" << (*it).mName << " Age:" << (*it).mAge << endl;
    }
    }
    //放对象指针
    void test02() {
    vector<Person*> v;
    //创建数据
    Person p1("aaa", 10);
    Person p2("bbb", 20);
    Person p3("ccc", 30);
    Person p4("ddd", 40);
    Person p5("eee", 50);
    v.push_back(&p1);
    v.push_back(&p2);
    v.push_back(&p3);
    v.push_back(&p4);
    v.push_back(&p5);
    for (vector<Person*>::iterator it = v.begin(); it != v.end(); it++) {
    Person * p = (*it);
    cout << "Name:" << p->mName << " Age:" << (*it)->mAge << endl;
    }
    }
    int main() {
    test01();
    test02();
    system("pause");
    return 0;
    }

    vector赋值操作

    函数原型:

    vector& operator=(const vector &vec); //重载等号操作符

    assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。

    assign(n, elem); //将n个elem拷贝赋值给本身。

    vector容量和大小

    函数原型:

    empty(); //判断容器是否为空

    capacity(); //容器的容量

    size(); //返回容器中元素的个数

    resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。 //如果容器变短,则末尾超出容器长度的元素被删除。

    resize(int num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。 //如果容器变短,则末尾超出容器长度的元素被删除

    vector插入和删除

    函数原型:

    push_back(ele); //尾部插入元素ele

    pop_back(); //删除最后一个元素

    insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele

    insert(const_iterator pos, int count,ele); //迭代器指向位置pos插入count个元素ele

    erase(const_iterator pos); //删除迭代器指向的元素

    erase(const_iterator start, const_iterator end); //删除迭代器从start到end之间的元素

    clear(); //删除容器中所有元素

    vector数据存取

    函数原型:

    at(int idx); //返回索引idx所指的数据

    operator[]; //返回索引idx所指的数据

    front(); //返回容器中第一个数据元素

    back(); //返回容器中最后一个数据元素

    vector互换容器

    函数原型: swap(vec); // 将vec与本身的元素互换

    swap可以使两个容器互换,可以达到实用的收缩内存效果:

    vector(v).swap(v); //匿名对象

    vector预留空间

    功能描述: 减少vector在动态扩展容量时的扩展次数

    函数原型: reserve(int len); //容器预留len个元素长度,预留位置不初始化,元素不可访问。

    如果数据量较大,可以一开始利用reserve预留空间

  • 相关阅读:
    PageObject小结
    python函数默认参数坑
    编译Android 8.0系统 并刷入pixel
    CF 289 F. Progress Monitoring DP计数
    EDU 61 F. Clear the String 区间dp
    Educational Codeforces Round 55 G 最小割
    Educational Codeforces Round 55 E 分治
    hdu 6430 bitset暴力
    AC自动机+DP codeforces86C
    CF895C dp/线性基
  • 原文地址:https://www.cnblogs.com/g414056667/p/13663109.html
Copyright © 2020-2023  润新知