在C++中常用的string的API都学习完了,这篇开始学习vector容器。vector有点类似数组,但是一个最懂扩容和支持尾部插入和删除的类似数组的容器。vector数据结构和数组非常相似,也称为单端数组,不同之处在于数组是静态空间,而vector可以动态扩容。
数组一旦创建了,就不可以改变,所以叫静态。也就是不可以给数组扩容,只能新建一个更大容量的数组。动态扩容不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间。

 

1.vector构造函数

构造函数原型:

vector<T> v;	// 采用模板实现类实现,默认构造函数
vector(v.begin(), v.end());	// 将v[begin(), end()]区间中的元素拷贝给本身
vector(n, ele);	// 构造函数将n个ele拷贝给本身
vector(const vector &vec);	// 拷贝构造函数

先来看看第一个默认的构造函数,然后使用for循环给容器添加元素,最后使用迭代器遍历元素打印输出。以下代码比较基础,后面会经常用到。

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

void printVector(vector<int> &v)
{
    // for循环迭代器遍历容器内元素
    for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";   
    }
    cout << endl;

}

void test01()
{
     
    // vector 构造函数
    vector<int> v1;
    // for循环给v1内添加元素
    for(int i=0; i < 10; i++)
    {
        v1.push_back(i);
    }
    // 遍历容器
    printVector(v1);
}

int main()
{
    test01();
    system("pause");
    return 0;
}

运行结果

这个printVector(vector<int> &v)是一个工具类函数,后面练习都需要用它来遍历打印输出看看测试效果。下面使用区间的构造方法去创建vector容器对象v2

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

void printVector(vector<int> &v)
{
    // for循环迭代器遍历容器内元素
    for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";   
    }
    cout << endl;

}

void test01()
{
    // vector 构造函数
    vector<int> v1;
    // for循环给v1内添加元素
    for(int i=0; i < 10; i++)
    {
        v1.push_back(i);
    }
    // 遍历容器
    printVector(v1);

    // 利用区间的方式进行构造
    vector<int> v2(v1.begin(), v1.end());
    printVector(v2);
}

int main()
{
    test01();
    system("pause");
    return 0;
}

还有两个构造,接着代码举例

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

void printVector(vector<int> &v)
{
    // for循环迭代器遍历容器内元素
    for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";   
    }
    cout << endl;

}

void test01()
{
    // n 给ele方式构造
    vector<int> v1(10, 8);
    // 遍历容器
    printVector(v1);

    // 拷贝构造
    vector<int> v2(v1);
    printVector(v2);
}

int main()
{
    test01();
    system("pause");
    return 0;
}

运行结果

vector容器的构造函数就练习到这里,接下来学习vector容器的赋值操作

 

2.vector赋值操作
这里说的赋值就是一次性给vector里面元素赋值,不是单一元素操作,构造函数是对象的创建,赋值是对象在初始化之后并赋值。常用几种赋值方式的函数原型
 

vector& operator=(const vector &vec);    // 重载等号操作符
assign(beg, end);    // 将[beg, end]区间中的数据拷贝赋值给本身
assign(n, ele);    // 将n个ele拷贝赋值给本身

练习代码

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

void printVector(vector<int> &v)
{
    // for循环迭代器遍历容器内元素
    for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";   
    }
    cout << endl;

}

void test01()
{
    // vector的赋值操作
    vector<int> v1;     // 创建一个对象
    v1.push_back(3);
    v1.push_back(5);
    v1.push_back(8);

    vector<int> v2;
    v2 = v1;
    printVector(v2);

    // n个ele的方式
    vector<int> v3;
    v3.assign(5,9);
    printVector(v3);

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

}

int main()
{
    test01();
    system("pause");
    return 0;
}

运行结果

 

3.vector的容量大小

函数原型

第一个函数empty()是判断容器是否为空,capacity()是容器容量,size()是元素总个数,剩下两个是调整容器长度,可能会造成数据丢失。

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

void printVector(vector<int> &v)
{
    // for循环迭代器遍历容器内元素
    for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";   
    }
    cout << endl;

}

void test01()
{
    // vector的容量和大小
    vector<int> v1;     // 创建一个对象
    for(int i=0; i < 10; i++)
    {
        v1.push_back(i);
    }

    // 获取容量
    int capa = v1.capacity();
    cout << "capacity= " << capa << endl;

    // 获取元素个数(大小)
    if(v1.empty())
    {
        cout << "size= 0" << endl;
    }
    elsecls
    {
        int num = v1.size();
        cout << "size= " << num << endl;
    }
    
    // 调整容器size大小
    v1.resize(20);  // 容量默认从16扩容到20
    printVector(v1);

    // 再次调整size
    v1.resize(25, 5);
    printVector(v1);

}

int main()
{
    test01();
    system("pause");
    return 0;
}

运行结果

验证了几点

1)vecotr容器容量默认是16

2)resize之后,如果比原来要打,默认填充如果数据类型是int,默认填充数字0

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐