C++容器使用详解---vector容器

1.vector容器

std::vector是C++标准模板库(STL)中的一个动态数组容器,其内部实现基于动态内存分配,能够自动调整大小。

  1. 动态大小: vector容器能够在运行时动态地增加或减少其容量以适应元素的数量变化,无需程序员显式地管理内存。

  2. 连续内存: 虽然可以动态调整大小,但vector中的元素在内存中是连续存储的,这使得它支持快速随机访问,类似于传统的数组。

  3. 容量与尺寸:

    • 容量(capacity): 容量是指vector当前所分配的内存空间能容纳的元素最大数量,即使这些位置可能尚未被使用。
    • 大小(size): 大小是指vector当前实际存储的元素数量。
  4. 自动扩展: 当向vector添加元素导致当前容量不足以容纳新元素时,vector会自动重新分配内存,通常是原容量的一定倍数(例如,常见实现会加倍现有容量),以减少频繁的内存重分配。

  5. 高效操作:

    • 尾部插入和删除元素的操作非常高效。
    • 使用索引或at()方法可以快速访问元素,时间复杂度为O(1)。
    • 插入或删除非尾部元素可能需要移动后续元素,因此操作成本较高。
  6. 迭代器: vector提供了随机访问迭代器,允许类似指针的操作,可以进行高效的遍历和元素访问。

  7. 构造与初始化: vector可以通过默认构造函数、指定大小的构造函数、区间构造函数或使用初始化列表等方式进行构造和初始化。

  8. 内存管理: vector负责其内部元素的内存管理,包括分配和释放,减轻了程序员的负担,但这也意味着在插入和删除操作中可能会有性能开销,尤其是在需要重新分配内存时。

vector结合了数组的高效访问特性和动态数组的灵活性,是处理可变数量序列数据时的常用选择。

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

示例:

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


int main(){
    vector<int> v;
    v.reserve(10);
    for (int i = 0; i < 10; ++i) {
        v.push_back(i);
    }
    for (int & it : v){
        cout << it << " ";
    }
    cout << endl;
    vector<int>v1(v.begin(),v.end());
    for (int &it : v1){
        cout << it << " ";
    }
    cout << endl;
    vector<int>v3(10,100);
    for (int &it : v3){
        cout << it << " ";
    }
    cout << endl;
    vector<int>v4(v3);
    for (int &it : v4) {
        cout << it << " ";
    }
    return 0;
}
2.vector容器的赋值操作
/*
 * vector& operator=(const vector &vec);//重载等号操作符
 * assign(beg,end);//将[beg,end)区间中的数据拷贝赋值给本身,
 * assign(n, elem);//将n个elem拷贝赋值给本身。
 */

示例:

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

int main(){
    vector<int>v;
    v.push_back(10);
    v.push_back(20);
    vector<int>v1;
    v1 = v;
    for (int &it : v1){
        cout << it << " ";
    }
    cout << endl;
    vector<int>v2;
    v2.assign(v.begin(), v.end());
    for(int &it : v2){
        cout << it << " ";
    }
    cout << endl;
    v2.assign(10,100);
    for(int &it : v2){
        cout << it << " ";
    }
    return 0;
}
3.vector容器的容量和大小
empty();//判断容器是否为空
capacity();//容器的容量
size();//返回容器中元素的个数
resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
                       //如果容器变短,则末尾超出容器长度的元素被删除。

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

示例:

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


int main(){
    vector<int>v;
    if (v.empty()){
        cout << "Nothing" << endl;
    }
    v.push_back(10);
    cout << v.size() << endl;
    v.reserve(5);  // 只扩充容量 不填充值  预先为vec分配至少能容纳5个元素的内存空间
    v.resize(5);
    for(int &it : v){
        cout << it << endl;
    }
    cout << v.size() << endl;
    cout << v.capacity() << endl;
    v.reserve(10);
    v.resize(10,10); //扩充部分填充10
    cout << v.size() << endl;
    cout << v.capacity() << endl;
    return 0;
}
4.vector容器的插入和删除
push back(ele);//尾部插入元素ele
pop_back();//删除最后一个元素
insert(const iterator pos,ele);//迭代器指向位置pos插入元素ele
erase(const iterator pos);//删除迭代器指向的元素
insert(const_iterator pos,int count,ele);//迭代器指向位置pos插入count个元素ele
erase(const iterator start,const iterator end);//删除迭代器从start到end之间的元素
clear();//删除容器中所有元素

示例:

#include <iostream>
using namespace std;
#include "vector"
int main(){
    vector<int>v;
    v.push_back(10);
    v.push_back(20);
    for(int &it : v){
        cout << it << " ";
    }
    cout << endl;
    v.pop_back();
    v.insert(v.begin(),5);
    for(int &it : v){
        cout << it << " ";
    }
    cout << endl;
    v.insert(v.begin(),101);
    for(int &it : v){
        cout << it << " ";
    }
    cout << endl;
    v.erase(v.begin());
    for(int &it : v){
        cout << it << " ";
    }
    cout << endl;
    v.erase(v.begin(), v.end());
    for(int &it : v){
        cout << it << " ";
    }
    cout << endl;
    v.clear();
    for(int &it : v){
        cout << it << " ";
    }
    return 0;
}
5.vector容器的数据存取
at(int idx);//返回索引idx所指的数据
operator[];//返回索引idx所指的数据
front();//返回容器中第一个数据元素
back();//返回容器中最后一个数据元素

示例:

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

int main(){
    vector<int>v;
    v.reserve(10);
    for(int i = 0;i < 10;++i){
        v.push_back(i);
    }
    cout << v.at(0) << endl;
    cout << v[1] << endl;
    cout << v.front() << endl;
    cout << v.back() << endl;
    return 0;
}
6.vector容器互换容器
swap(vec);//将容器vec与自身互换

示例:

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

int main() {
    vector<int> v;
    v.reserve(10);
    for (int i = 0; i < 10; ++i) {
        v.push_back(i);
    }
    vector<int>v1;
    v1.swap(v);
    for(int &it : v1){
        cout << it << " ";
    }
	//使用swap收缩内存
    //vector<int>(v).swap(v); //创建匿名对象以v的大小初始化,互换两个容器,匿名对象在当前行执行完毕后,内存被回收
    return 0;
}
7.vector容器预留空间

在C++的STL中,std::vector容器的reserve方法用于预先为容器分配内存空间,但不初始化元素,也不改变容器中元素的数量。这个方法的主要目的是为了优化性能,特别是当你已经知道或者可以预测到容器未来需要容纳多少元素时,通过提前分配足够的内存,可以减少在插入元素过程中因自动扩容而引起的内存重新分配和数据迁移次数。

  • 功能reserve函数允许你设定容器的容量(capacity)。也就是说,它保证了在不做进一步内存重新分配的情况下,容器至少可以容纳指定数量的元素。

  • 参数:它接受一个参数,即你希望预留的未初始化元素的个数。这个参数应该是非负的,如果小于当前容量,则调用不会有任何效果。

  • 不影响元素:调用reserve不会改变容器中已有元素的数量,也不会影响已有元素的值。

  • 性能优势:通过预先分配内存,可以避免在多次插入操作中频繁地重新分配和复制数据,这对于性能敏感的应用特别重要。特别是在循环中添加大量元素时,先调用一次reserve可以显著提升效率。

  • 不初始化元素:与resize不同,reserve不会修改容器的实际大小(即元素数量),也不会对新分配的内存区域中的元素进行初始化。

  • 示例用法:

    std::vector<int> vec;
    vec.reserve(100); // 预先为vec分配至少能容纳100个元素的内存空间
    

reserve是一种优化手段,帮助程序减少运行时的内存管理和分配开销,特别是在明确知道所需内存大小的情况下。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FightingLod

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值