c++ Vector容器

2022-11-20  本文已影响0人  arkliu

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() 的区别:

上一篇下一篇

猜你喜欢

热点阅读