【C++】vector容器

目录

vector 基本概念

vector 赋值操作

vector 容量和大小

vector 插入和删除

vector 数据存取

vector 互换容器

vector 预留空间


vector 基本概念

功能

  • vector 数据结构和数组相似,也称为单端数组(矢量容器)

 

-------------------

vector 与 普通数组区别

  • 需要包含头文件 <vector>
  • 不同之处在于数组是静态空间,而 vector 可以动态扩展

-------------------

动态拓展

  • 并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间
  • vector 容器的迭代器支持随机访问

-------------------

vector 构造函数

// 采用模板实现类实现,默认构造函数
vector<T> v;

// 将 v[begin(), end()) 区间中的元素拷贝给本身
vector(<v.begin(), v.end()>);

//构造函数将 n 个 elem 拷贝给本身
vector(n, elem);

// 拷贝构造函数
vector(const vector& vec);

测试代码:

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

void PrintVector(vector<int>& v) {
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}

void test() {
    // 1、默认构造(无参构造)
    vector<int> v1; 
    for (int i = 0; i < 5; i++) {
        v1.push_back(i);
    }
    PrintVector(v1); // 0-4

    // 2、区间方式构造,把迭代器区间传入
    vector<int>v2(v1.begin(), v1.end());
    PrintVector(v2); // 0-4

    // 3、n 个 elem 方式构造
    vector<int>v3(10, 100);
    PrintVector(v3); // 10 个 100

    // 4、拷贝构造
    vector<int>v4(v3);
    PrintVector(v4); // 10 个 100

}

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

运行结果:


vector 赋值操作

功能

  • 给 vector 容器赋值

-------------------

函数原型

// 重载等号
vector& operator=(const vector& vec);

// 将 [beg, end] 区间中的数据拷贝给本身
assign(beg, end);

// 将 n 个 elem 拷贝赋值给本身
assign(n, elem);

测试代码:

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

void PrintVector(vector<int>& v) {
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}

void test() {
    vector<int>v1;
    for (int i = 0; i < 5; i++) {
        v1.push_back(i);
    }
    PrintVector(v1); // 0-4

    // 重载 = 赋值
    vector<int>v2;
    v2 = v1; // 将 v1 数据赋值给 v2
    PrintVector(v2); // 0-4

    // 区间数据赋值
    vector<int>v3;
    v3.assign(v2.begin(), v2.end());
    PrintVector(v3); // 0-4

    // n 个 elem 赋值
    vector<int>v4;
    v4.assign(3, 1); // 3 个 1
    PrintVector(v4);
}

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

运行结果:


vector 容量和大小

功能

  • 对 vector 容器的容量和大小操作

----------------------

函数原型

// 判断容器是否为空
empty();

// 容器的容量
capacity();

// 返回容器中元素的个数
size();

// 重新指定容器的长度为 num,若容器变长,则默认值填充新位置
// 如果容器变短,则末尾超出容器长度的元素被删除
resize(int num);

// 重新指定容器的长度为 num,若容器变长,则以 elem 值填充新位置
// 如果容器变短,则末尾超出容器长度的元素被删除
resize(int num, elem);

测试代码:

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

void PrintVector(vector<int>& v) {
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}

void test() {
    vector<int>v1;
    for (int i = 0; i < 5; i++) {
        v1.push_back(i);
    }
    PrintVector(v1);
    
    // 判断是否为空
    if (v1.empty()) {
        cout << "v1 为空" << endl;
    }
    else {
        cout << "v2 不为空" << endl;
        // 容器容量
        cout << "v1 的容量 = " << v1.capacity() << endl; // 6

        // 容器长度
        cout << "v1 的长度 = " << v1.size() << endl; // 5

        // 重新指定大小
        v1.resize(10); // 从 5 变成 10
        PrintVector(v1); // 新位置的数默认为 0

        v1.resize(5); // 改回 5,减少了5
        PrintVector(v1); // 超出来的数被删除
    }
}

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

运行结果:


vector 插入和删除

功能

  • 对 vector 容器进行插入、删除操作

----------------------

函数原型

// 尾部插入元素
push_back(ele);

// 删除最后一个元素
pop_back();

// 迭代器指向位置 pos 插入元素 ele
insert(const_iterator pos, ele);

// 迭代器指向位置 pos 插入 count 个元素 ele
insert(const_iterator pos, int count, ele);

// 删除迭代器指向的元素
erase(const_iterator pos);

// 删除迭代器从 start 到 end 之间的元素
erase(const_iterator start, const_iterator end);

// 删除容器中所有元素
clear();

测试代码:

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

void PrintVector(vector<int>& v) {
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}

void test() {
    vector<int> v1;
    // 尾插
    for (int i = 0; i < 5; i++) {
        v1.push_back(i);
    }
    cout << "尾插结果:";
    PrintVector(v1);

    // 尾删
    v1.pop_back();
    cout << "尾删结果:";
    PrintVector(v1);

    // 插入 (头插) (第一个参数是迭代器)
    v1.insert(v1.begin(), -1);
    cout << "插入结果:";
    PrintVector(v1);

    v1.insert(v1.begin(), 3, 100);
    cout << "插入结果:";
    PrintVector(v1);

    // 删除 (头删)
    v1.erase(v1.begin());
    cout << "删除结果:";
    PrintVector(v1);

    v1.erase(v1.begin() + 1, v1.end() - 3); // 删除下标为 1 到 倒数下标为 3 
    cout << "删除结果:";
    PrintVector(v1); 

    vector<int> v2;
    v2.push_back(10);
    v2.clear(); // 清空
    cout << "清空结果:";
    PrintVector(v2);
}

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

 运行结果:

  • 尾插 --- push_back
  • 尾删 --- pop_back
  • 插入 --- insert(位置迭代器)
  • 删除 --- erase(位置迭代器)
  • 清空 --- clear

vector 数据存取

功能

  • 对 vector 中的数据的存取操作

------------------

函数原型

// 返回索引 idx 所指的数据
at(int idx);

// 返回索引 idx 所指的数据
operator[];

// 返回容器中第一个数据元素
front();

// 返回容器中最后一个元素
back();

测试代码:

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

void test() {
    vector<int>v1;
    for (int i = 0; i < 5; i++) {
        v1.push_back(i);
    }
    
    // [] 访问数组中元素
    for (int i = 0; i < v1.size(); i++) {
        cout << v1[i] << " ";
    }
    cout << endl;

    // at 访问数组中数据
    for (int i = 0; i < v1.size(); i++) {
        cout << v1.at(i) << " ";
    }
    cout << endl;

    // 获取第一个元素
    cout << "第一个元素为:" << v1.front() << endl;

    // 获取最后一个元素
    cout << "最后一个元素:" << v1.back() << endl;
}

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

运行结果:

  • 除了迭代器获取 vector 容器中元素,[ ]at 也可以 
  • front 返回容器第一个元素
  • back 返回容器最后一个元素

vector 互换容器

功能

  • 实现两个容器内元素进行交换

------------------

函数原型

// 将 vec 与本身的元素交换
swap(vec);

测试代码:

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

void PrintVector(vector<int>& v) {
    for (vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
        cout << *it << " ";
    }
    cout << endl;
}

void test01() {
    // vector 容器 1
    vector<int>v1;
    for (int i = 0; i < 3; i++) {
        v1.push_back(i + 1); // 1 - 3
    }
    // vecotr 容器 2
    vector<int>v2;
    for (int i = 3; i < 7; i++) {
        v2.push_back(i + 1); // 4 - 7
    }
    // 交换前
    cout << "---交换前---           " << endl;
    cout << "v1:";
    PrintVector(v1); // 1 2 3
    cout << "容量:" << v1.capacity() << endl; // 3
    cout << "长度:" << v1.size()     << endl; // 3

    cout << "v2:";
    PrintVector(v2); // 4 5 6 7
    cout << "容量:" << v2.capacity() << endl; // 4
    cout << "长度:" << v2.size()     << endl; // 4

    // 交换 v1 和 v2 后
    v1.swap(v2);
    cout << "---交换后---           " << endl;
    cout << "v1:";
    PrintVector(v1); // 4 5 6 7 
    cout << "容量:" << v1.capacity() << endl; // 4
    cout << "长度:" << v1.size()     << endl; // 4

    cout << "v2:";
    PrintVector(v2); // 1 2 3
    cout << "容量:" << v2.capacity() << endl; // 3
    cout << "长度:" << v2.size()     << endl; // 3
}

void test02() {
    cout << "-------------------"     << endl;
    vector<int>v;
    for (int i = 0; i < 100; i++) {
        v.push_back(i);
    }
    cout << "v 尾插入 100 个数据后:" << endl;
    cout << "容量:" << v.capacity()  << endl; // 141
    cout << "长度:" << v.size()      << endl; // 100

    // 重新指定大小
    v.resize(5);
    cout << "重新指定大小后:"        << endl;
    cout << "容量:" << v.capacity()  << endl; // 141
    cout << "长度:" << v.size()      << endl; // 5

    // 巧用 swap 收缩内存
    vector<int>(v).swap(v); // 匿名对象,按照 v 目前所用的元素个数初始化匿名对象
    cout << "swap 收缩后:"           << endl;
    cout << "容量:" << v.capacity()  << endl; // 5
    cout << "长度:" << v.size()      << endl; // 5
}

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

运行结果:

swap 可以交换两个容器,可以达到实用的收缩内存效果


vector 预留空间

功能

  • 减少 vector 在动态扩展容量时的扩展次数

---------------

函数原型

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

测试代码:

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

void test01() {
    vector<int>v;
    int num = 0;
    int* p = NULL;
    for (int i = 0; i < 100000; i++) {
        v.push_back(i);
        // 记录开辟了多少次内存
        if (p != &v[0]) {
            p = &v[0];
            ++num;
        }
    }
    cout << "开辟 10000(十万) 个容量,开辟多少次内存:" << num << endl; // 30
    // 开辟十万的容量需要30次
    // 所以可以一开始就对容器预留
}

void test02() {
    vector<int>v;
    // 开始对 容器 v 进行预留空间
    v.reserve(100000);
    int num = 0;
    int* p = NULL;
    for (int i = 0; i < 100000; ++i) {
        v.push_back(i);
        // 记录开辟多少次内存
        if (p != &v[0]) {
            p = &v[0];
            ++num;
        }
    }
    cout << "开辟 100000(十万)个容量,开辟多少次内存:" << num << endl; // 1
}

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

运行结果:

重新开辟内存空间的次数,是指旧空间不够,于是创建一个满足当前需要的新空间,将旧空间里的数据拷贝进新空间,再将旧空间进行释放。这个不走越多,所消耗的时间也就越长。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值