STL之vector容器

vector容器是一种动态数组,其本质的实现就是数组。

一、vector对象的默认构造

vector<int> v1;
vector<char> v2;
vector<string> v3;
vector<CA*> v4;     //CA是自定义类
vector<CA> v5;    //CA是自定义类型

vector是一种模板类,可以接受各种数据类型,需要注意的是,对于

vector<CA> v5;

对于存储自定义类的对象的vector,必须提供拷贝构造函数,不管是默认的还是自定义的拷贝构造函数,但不能分浅拷贝和深拷贝,因为容器元素的存放是按值赋值的方式进行的,这样才能保证对象的正常拷贝。

二、vector对象初始化

这里用int类型为例

vector<int> v1;    //vector对象的默认构造
vector<int> v2 = v1; //vector对象的拷贝构造
vector<int> v3(v1.begin(), v1.begin() + 2);  //vector带参数的构造
vector<int> v4(3, 9);   //开辟3个空间,并初始化为9
vector<int> v5(10);    //开辟10个空间,默认初始化为0(这里是int型,不同类型初始化不同)

三、数组尾部元素的添加与删除

#include<iostream>
#include<vector>

using namespace std;

void func1() {
    vector<int> v1;
    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);

    v1.front() = 11;
    v1.back() = 33;

    cout << "头部元素: " << v1.front() << endl;
    cout << "尾部元素: " << v1.back() << endl;

    for (int i = 0; i < 3; i++) {
        cout << v1.back() << endl;
        v1.pop_back();
    }
}

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

输出结果:

这里写图片描述

vector通过push_back函数向数组尾部添加元素,通过pop_back函数从尾部删除元素,通过front获取头部元素,通过back获取尾部元素;

v1.front() = 11;
v1.back() = 33;

front函数和back函数可以作为左值,说明函数的返回值返回了引用,是可以修改值的。

四、vector的遍历

1、数组方式遍历

void func3() {
    vector<int> v;
    cout << v.capacity() << endl;
    for (int i = 0; i < 10; i++)
        v[i] = i + 1;
    for (int i = 0; i < 10; i++)
        cout << v[i] << endl;
}

这里会报错:

这里写图片描述

因为现在v.capacity() = 0,也就是说现在v没有空间,利用数组的形式v[i] = i + 1;自然会报错,因为v[i]不存在,修改如下:

void func3() {
    vector<int> v(10);
    cout << v.capacity() << endl;
    for (int i = 0; i < 10; i++)
        v[i] = i + 1;
    for (int i = 0; i < 10; i++)
        cout << v[i] << " ";
    cout << endl;
}

输出结果:

这里写图片描述

2、迭代器正向遍历

void func4() {
    vector<int> v(5, 1);
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
        cout << *it << endl;
}

输出结果:

这里写图片描述

3、迭代器逆向遍历

void func5() {
    vector<int> v(10);
    for (int i = 0; i < 10; i++)
        v[i] = i + 1;
    for (vector<int>::reverse_iterator rit = v.rbegin(); rit != v.rend(); rit++)
        cout << *rit << " ";
    cout << endl;
}

输出结果:

这里写图片描述

画一下vector的begin,end,rbegin,rend分别指向哪:

这里写图片描述
这就是迭代器指向的位置,正向迭代器是从begin到end,逆向迭代器是rbegin到rend。

4、迭代器的类型

上面扯到了迭代器,就稍微说一下迭代器的类型,先简单印一下,后面分别说容器的时候再详细介绍。
迭代器分为五类:

输入迭代器:也叫只读迭代器,他从容器中选取元素,只能一次读入一个元素向前移动,只支持一遍算法,同一个输入迭代器不能两遍遍历同一个序列;

输出迭代器:也叫只写迭代器,它往容器中写入元素,只能一次写入一个元素向前移动,只支持一遍算法,同一个输出迭代器不能两遍遍历同一个序列;

正向迭代器:组合输入迭代器和输出迭代器的功能,还可以多次解析一个迭代器指定的位置,可以对一个值进行多次读/写;

双向迭代器:组合正向迭代器的功能,还可以通过- - 操作向后移动位置,双向迭代器支持it++, ++it, it- - , it - -, *it, itA = it B操作;

随机访问迭代器: 组合双向迭代器的功能,还可以向前向后跳过任意个位置,可以直接访问任意位置的元素。

vector迭代器就是一种随机访问迭代器。

typedef typename _Mybase::iterator iterator;
typedef typename _Mybase::const_iterator const_iterator;

typedef _STD reverse_iterator<iterator> reverse_iterator;
typedef _STD reverse_iterator<const_iterator> const_reverse_iterator;

这里带const的迭代器就是只读迭代器。

注意:

vector的push_back永远只是在尾部添加元素:

void func2() {
    vector<int> v(10);
    v.push_back(1);
    v.push_back(2);
    for (int i = 0; i < v.size(); i++)
        cout << v[i] << " ";
    cout << endl;
}

输出结果:

这里写图片描述

虽然

vector<int> v(10);

只是开辟了10个空间,但实际上编译器自动赋初值了,push_back是在第11个位置开始添加的。

五、vector中元素的插入与删除

1、插入

vector.insert(pos, elem);   //在pos位置插入元素elem
vector.insert(pos, n, elem);   //在pos位置插入n个elem元素
vector.insert(pos, begin, end);   //在pos位置插入beginend区间的元素
void func(){
    vector<int> v(5);
    vector<int> v2(3,3);
    for(int i = 0; i < 5; i++)
        v[i] = i + 1;
    v.insert(v.begin(), 6);    //v中元素为: 6 1 2 3 4 5
    v.insert(v.end(), 2, 7);    //v中元素为: 6 1 2 3 4 5 7 7 
    v.insert(v.begin(), v2.begin(), v2.end());    //v中元素为: 3 3 3 6 1 2 3 4 5 7 7
}

2、删除

vector.clear();    //删除vector中的全部元素
vector.erase(begin, end);    //删除区间beginend的元素
vector.erase(it);    //删除迭代器it所指向的位置
void func(){
    vector<int> v(5);
    for(int i = 0; i < 5; i++)
        v[i] = i + 1;
    v.erase(v.begin(), v.begin() + 2);    //v中元素为: 3 4 5
    v.clear();    //此时v中无元素
}

最后那个用删除vector中所有值为1的元素为例:

void print(vector<int>& v) {
    for (int i = 0; i < v.size(); i++)
        cout << v[i] << " ";
    cout << endl;
}

void func8() {
    vector<int> v(10);
    for (int i = 0; i < 10; i++)
        v[i] = i + 1;
    v[3] = 1;
    v[5] = 1;
    print(v);
    vector<int>::iterator it = v.begin();
    while (it != v.end())
        if (*it == 1)
            it = v.erase(it);   //删除it指向的位置后,会返回删除位置的下一个位置
        else
            it++;
    print(v);
}

输出结果:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值