3.2 vector容器

 

单端数组

数组是静态空间,但是vector可以动态扩展

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

因为没法保证后面的空间是不是空闲的

 

vector的迭代器是一个很强大的迭代器,因为它支持随机访问!

vector是单端数组,因为前端是封闭的,只能从尾部插入和删除,插入命令push_back(),删除pop_back();

vector的几个常用的迭代器:v.begin()指向容器的第一个元素,v.end()指向容器最后一个元素的下一个位置,v.rbegin指向最后一个元素,v.rend()指向第一个元素的前一个位置;还可以通过insert命令进行插入,erase命令进行删除等。

 

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

// vector容器的构造
void printVector(vector<int>& v)
{
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test01()
{
    vector<int> v1; // 默认构造
    for (int i = 0; i < 10; i++) {
        v1.push_back(i);
    }

    printVector(v1); 

    vector<int> v2(v1.begin(), v1.end()); // 区间方式
    printVector(v2);

    vector<int> v3(10, 100); // n个elem
    printVector(v3);

    vector<int> v4(v3); // 拷贝构造
    printVector(v4);

}
int main()
{    
    test01();
    return 0;
}

 

vector<int> v1;
for (int i = 0; i < 10; i++)
{
    v1.push_back(i);        
}
vector<int> v2;
v2 = v1;
vector<int>v3;
v3.assign(v1.begin, v1.end); // 区间左闭右开
vector<int> v4;
v4.assign(10, 100); // 赋值行为

 

capacity() >= size()

resize重新指定大小

resize更大默认填充0,如果需要改,传入elem

如果重新指定比原来短,超出部分会删除

 

insert注意要提供迭代器

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

// vector容器的插入和删除
void printVector(vector<int>& v)
{
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test01()
{
    vector<int> v1;
    // 尾插法
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);
    printVector(v1);

    // 尾删
    v1.pop_back(); // 50删除

    // 插入,第一个参数是迭代器
    v1.insert(v1.begin(), 100);
    
    v1.insert(v1.begin(), 2, 100); //在最前面插入2个100

    //删除
    v1.erase(v1.begin());

    v1.erase(v1.begin(), v1.end()); // 相当于清空

    v1.clear(); // 清空操作,跟上面一样


}
int main()
{    
    test01();
    return 0;
}

 

 

几个访问元素的方法

front和back

 

互换操作和实际用途

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

// vector容器的互换
void printVector(vector<int>& v)
{
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}
//
void test01()
{
    vector<int> v1;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
    }
    printVector(v1);

    vector<int> v2;
    for (int i = 10; i > 0; i--)
    {
        v2.push_back(i);
    }
    printVector(v2);

    v1.swap(v2); // v1和v2容器的内容对应位置进行交换

}

// 实际用途
// 巧用swap可以收缩内存空间
void test02()
{
    vector<int> v;
    for (int i = 0; i < 100000; i++)
    {
        v.push_back(i);
    }
    cout << "v的容量为:" << v.capacity() << endl; // 138255
    cout << "v的大小为:" << v.size() << endl; // 100000

    v.resize(3); // 重新指定大小
    cout << "v的容量为:" << v.capacity() << endl; // 138255 剩下空间全部浪费
    cout << "v的大小为:" << v.size() << endl; // 3

    // 巧用swap收缩内存
    vector<int>(v).swap(v);
    // vector<int>(v) 匿名对象    会按照v目前的容量初始化这个匿名对象    .swap()容器交换    匿名对象当前行执行完立马回收    目的达成
}

int main()
{    
    test02();
    return 0;
}

 

只是找了块空地,不能访问

有什么用:

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

// vector容器的互换
void printVector(vector<int>& v)
{
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}
//
void test01()
{
    vector<int> v1;
    // 统计总共动态扩展了多少次
    // 利用reserse预留空间
    v1.reserve(100000);
    int num = 0;
    int* p = nullptr;
    for (int i = 0; i < 100000; i++)
    {
        v1.push_back(i);
        if (p != &v1[0])
        {
            p = &v1[0];
            num++;
        }
    }
    cout << num << endl; // 30
}

int main()
{    
    test01();
    return 0;
}

 

posted @ 2021-01-18 19:46  不妨不妨,来日方长  阅读(87)  评论(0编辑  收藏  举报