美文网首页
c++ Vector容器

c++ Vector容器

作者: arkliu | 来源:发表于2022-11-20 09:35 被阅读0次

    vector容器

    vector使用数组实现。

    #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<string>
    
    using namespace std;
    
    class Person {
        public:
            string m_name;
            int m_age;
            Person(string name, int age) {
                this->m_name = name;
                this->m_age = age;
            }
    };
    
    using namespace std;
    
    void myPrint(int value) {
        cout << value << "   ";
    }
    
    void test01() {
        vector<int> v;// 声明一个容器,这个容器存放int类型数据
        // 向容器中加入数据
        v.push_back(10);
        v.push_back(20);
        v.push_back(30);
        v.push_back(40);
        v.push_back(50);
    
        // 遍历迭代器
        vector<int>::iterator itBegin = v.begin();//itBegin指向v容器中的起始位置
        vector<int>::iterator itEnd = v.end(); //itEnd指向v容器中的最后一个位置的下一个地址
        // 第一种遍历
        while (itBegin != itEnd)
        {
            cout << *itBegin << "   ";
            itBegin++;
        }
        cout << endl;
        // 第二种方式遍历
        for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
        {
            cout << *it<< "   ";
        }
        cout << endl;
        // 使用for_each需要引入#include<algorithm>
        for_each(v.begin(), v.end(), myPrint);
    }
    
    // 自定义类型
    void test02() {
        vector<Person> v;
        Person p1("张三", 11);
        Person p2("lisi", 22);
        Person p3("王麻子", 14);
        Person p4("赵六", 53);
        v.push_back(p1);
        v.push_back(p2);
        v.push_back(p3);
        v.push_back(p4);
    
        for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
        {
            cout << " name = "<< (*it).m_name<<"   age = "<<it->m_age<< endl;
        }
    }
    
    //存放自定义数据类型的指针
    void test03() {
    vector<Person *> v;
        Person p1("张三", 11);
        Person p2("lisi", 22);
        Person p3("王麻子", 14);
        Person p4("赵六", 53);
        v.push_back(&p1);
        v.push_back(&p2);
        v.push_back(&p3);
        v.push_back(&p4);
    
        for (vector<Person *>::iterator it = v.begin(); it != v.end(); it++)
        {
            cout << "Person * name = "<< (*it)->m_name<<"   age = "<<(*it)->m_age<< endl;
        }
    }
    
    // 容器嵌套
    void test04() {
        vector<vector<int>> v;
        vector<int>v1;
        vector<int>v2;
        vector<int>v3;
        // 装数据
        for (size_t i = 0; i < 5; i++)
        {
            v1.push_back(i+3);
            v2.push_back(i+8);
            v3.push_back(i+12);
        }
        v.push_back(v1);
        v.push_back(v2);
        v.push_back(v3);
        
        // 遍历容器
        for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++)
        {
            for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++) {
                cout << *vit << "   ";
            }
            cout << endl;    
        }
        
    }
    
    int main() {
        // test01();
        // test02();
        // test03();
        test04();
        return 0;
    }
    
    image.png

    vector构造

    void printVector(vector<int>& v) {
        for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
        {
            cout << *it<< "   ";
        }
        cout << "===================="<< endl;
    }
    
    // vector构造
    void test05() {
        // 1. 使用数组构造
        int arr[] = {1,2,3,45,6};
        vector<int> v1(arr, arr + sizeof(arr) / sizeof(int));
        printVector(v1);
        // 2. 通过vector构造
        vector<int> v2(v1.begin(), v1.end());
        
        vector<int>v3(10, 100);// v3里包含10个100
        printVector(v3);
    }
    

    vector赋值

    // vector 赋值
    void test06() {
        vector<int>v(12, 33);// v3里包含10个100
        vector<int>v2;
        if (v2.empty())
        {
            cout << "v2 is empty"<<endl;
        }
        cout << "v2的size = "<<v2.size() << "   v2的容器大小 = "<<v2.capacity()<<endl;
        v2.assign(v.begin(), v.end());
        cout << "v2的size = "<<v2.size() << "   v2的容器大小 = "<<v2.capacity()<<endl;
        
        vector<int>v3;
        v3.assign(3,55); // 3个55
        
        printVector(v2);
        printVector(v3);
        v3.swap(v2); // 交换v2和v3里的数据
        printVector(v2);
        printVector(v3);
    }
    

    vector.resize(newSize)

    void test07() {
        vector<int>v(12, 33);// v3里包含10个100
        cout << "v size = "<<v.size() << endl;
    
        v.resize(4);
        cout << "v size = "<<v.size()<< endl;
        printVector(v);
    
        v.resize(20, -1); // 指定resize到20个元素,多出的元素默认值为-1, 如果不填写,默认为0
        cout << "v size = "<<v.size()<< endl;
        printVector(v);
    }
    
    image.png

    使用swap收缩空间

    // 巧用swap收缩空间
    void test08() {
        vector<int>v;
        for (size_t i = 0; i < 10000; i++)
        {
            v.push_back(i);
        }
        cout << "v的size = "<<v.size() << "   v2的容器大小 = "<<v.capacity()<<endl;
        v.resize(3); // 大小变为3个了,容量依然很大
        cout << "v的size = "<<v.size() << "   v2的容器大小 = "<<v.capacity()<<endl;
        // 使用size为3的vector<int>v初始化一个匿名对象(该匿名对象的大小和容量都是3),然后和v交换
        vector<int>(v).swap(v); 
        cout << "v的size = "<<v.size() << "   v2的容器大小 = "<<v.capacity()<<endl;
    }
    
    image.png

    vector使用reserve

    reserve(int len) 容器预留len个元素长度,预留位置不初始化,元素不可访问

    void test09() {
        vector<int>v;
        int *p = NULL;
        int num = 0;
        v.reserve(10000); // 使用reserve预留空间,避免后续多次开辟空间
        for (size_t i = 0; i < 10000; i++)
        {
            v.push_back(i);
            if (p != &v[0])
            {
                p = &v[0];
                num++;
            }
        }
        cout << "num = "<< num<<endl; // num表示开辟空间的次数
    }
    
    

    vector常用接口

    at(int idx) //返回索引idx所指的数据,如果idx越界,抛出out of rang
    operator[int idx] //  返回索引idx所指的数据,越界时,直接报错
    front()  // 容器中第一个数据元素
    back()   // 容器中最后一个数据元素
    
    iterator insert(const_iterator pos, int count, ele)  //向位置pos插入count个元素ele
    push_back(ele)//尾部插入元素ele
    pop_back()  // 删除最后一个元素
    erase(const_iterator start, const_iterator end) // 删除从start到end之间的元素
    erase(const_iterator pos)  // 删除位置pos的元素
    clear() // 删除容器中的所有元素
    
    void test10() {
        vector<int> v;// 声明一个容器,这个容器存放int类型数据
        // 向容器中加入数据
        v.push_back(10);
        v.push_back(20);
        v.push_back(30);
        v.push_back(660);
        cout<< "v.front = " << v.front() << "  v.back = "<<v.back()<<endl; //v.front = 10  v.back = 660
        
        v.insert(v.begin(), 3, 100); // 参数1:迭代器  参数2: 个数   参数3:元素
        printVector(v);
    
        v.pop_back();// 删除最后一个元素
        printVector(v);
    
        v.erase(v.begin()); // 删除第一个元素
        printVector(v);
    }
    

    vector逆序遍历

    void test11() {
        vector<int> v;
        for (size_t i = 0; i < 10; i++)
        {
            v.push_back(i);
        }
        // reverse_iterator 逆序迭代器
        for (vector<int>::reverse_iterator it = v.rbegin(); it < v.rend(); it++)
        {
            cout << *it<< "   ";
        }
    }
    

    emplace_back()

    该函数是c11 新增加的,其功能和 push_back() 相同,都是在 vector 容器的尾部添加一个元素。

    emplace_back() 和 push_back() 的区别:

    • push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素)
    • emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。

    相关文章

      网友评论

          本文标题:c++ Vector容器

          本文链接:https://www.haomeiwen.com/subject/nhvnzrtx.html