c++学习之vector容器

一、vector基本概念

功能:vector数据结构和数组非常相似,也称单端数组
vector与普通数组区别:不同之处在于数组是静态空间,而vector可以动态扩展
动态扩展:空间不够,寻找一个更大的空间,将原有数据拷贝到新空间,释放原空间

在这里插入图片描述
vector容器的迭代器是支持随机访问的迭代器

二、vector构造函数

函数原型

vector< int>v; //采用模板实现类实现,默认构造函数
vector < int>v1(v.begin(),v.end()) //将v[begin(),end()]区间的元素拷贝
vector < int>v3(n,elem)//构造函数将n个elem拷贝
vector < int>v4(const vector &vec);//拷贝构造函数

代码示例

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

void printk(vector<int> &v)
{
    for(vector<int>::iterator i = v.begin(); i != v.end(); i++)
    {
        cout<< (*i)<< " ";
    }
    cout << endl;
}
//vector容器的构造函数
void test1()
{
    //1.默认构造,无参构造
    vector<int>v1;  
    for(int i = 0; i < 10; i++)
    {
        v1.push_back(i);
    }
    printk(v1);
       for(int i = 0; i < 20; i++)
    {
        v1.push_back(i);
    }
    printk(v1);

    //2.区间构造
    vector<int>v2(v1.begin(),v1.end());
    printk(v2);
    
    //3.n个数据构造
    vector< int>v3(10,100);
    printk(v3);

    //4.拷贝构造
    vector< int>v4(v3);
     printk(v4);
}
int main()
{ 
    test1();
    return 0;
}

结果输出
在这里插入图片描述

三、vector的赋值操作

函数原型

vector& opertor =(const vector &vec); //重载运算符操作函数
assign(begin,end); 区间赋值
assign(n,elem);//将n个elem拷贝

代码示例

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

void printk(vector<int> &v)
{
    for(vector<int>::iterator i = v.begin(); i != v.end(); i++)
    {
        cout<< (*i)<< " ";
    }
    cout << endl;
}
//vector容器的构造函数
void test1()
{
    //1.默认构造,无参构造
    vector<int>v1;  
    for(int i = 0; i < 10; i++)
    {
        v1.push_back(i);
    }
    printk(v1);
    //2.运算符重载赋值
    vector<int>v2;
    v2 = v1;
    printk(v2);

    //3.区间赋值
    vector<int>v3;
    v3.assign(v2.begin(),v2.end());
    printk(v3);
    
    //4.n个元素赋值
    vector<int>v4;
    v4.assign(10,100);
    printk(v4);


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

结果输出
在这里插入图片描述

四、vector容量和大小

函数原型:

empty(); //判断容器是否为空
capacity(); //容器的容量
size(); //返回容器中元素的个数
resize(int num); //重新指定容器的长度num,若容器变长,则以默认值填充,若容器变短,则末尾超出容器长度的元素被删除
resize(int num, elem);//重新指定容器的长度num,elem为填充值

代码示例

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

void printk(vector<int> &v)
{
    for(vector<int>::iterator i = v.begin(); i != v.end(); i++)
    {
        cout<< (*i)<< " ";
    }
    cout << endl;
}
//vector容器的构造函数
void test1()
{
    //1.默认构造,无参构造
    vector<int>v1;  
    for(int i = 0; i < 10; i++)
    {
        v1.push_back(i);
    }
    printk(v1);
  
    if(v1.empty())
    {
        cout<< "v1 为空" << endl;
    }
    else
    {
        cout<< "v1 不为空"<< endl;
    }
    
    cout<< v1.size() <<endl;
    v1.resize(15);
    printk(v1);
  
    v1.resize(5);
    printk(v1);
  
    v1.resize(15,10);
    printk(v1);
  
 


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

输出结果

在这里插入图片描述

五、vector插入和删除

函数原型:

push_back(ele); //尾插
pop_back(); //尾删
insert(const_iterator pos,ele); //迭代器指向位置pos插入ele
insert(const_iterator pos,int cout,ele); //迭代器指向位置pos插入count个元素ele
erase(const_iterator pos); //删除迭代器指向的元素
erase(const_iterator start,const_iterator end); //区间删除
clear(); //清空

代码示例

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

void printk(vector<int> &v)
{
    for(vector<int>::iterator i = v.begin(); i != v.end(); i++)
    {
        cout<< (*i)<< " ";
    }
    cout << endl;
}
//vector容器的构造函数
void test1()
{
    //默认构造,无参构造
    vector<int>v1;  
    for(int i = 0; i < 10; i++)
    {
        //1。尾插
        v1.push_back(i);
    }
    printk(v1);
    
    //2.尾删
    v1.pop_back();
    v1.pop_back();
    v1.pop_back();
    printk(v1);

    //3.向容器指定位置插入元素
    v1.insert(v1.begin(), 10);         //第0
    v1.insert(v1.begin()+1, 100);      //第1
    v1.insert(v1.begin()+2, 1000);     //第2
    v1.insert(v1.begin()+3, 10000);    //第3
    printk(v1);

    //4.向指定位置插入n个elem
    v1.insert(v1.begin(), 5,10);    
    printk(v1);
    
    //5.擦除
    v1.erase(v1.begin());   
    printk(v1);
    
    //6.区间擦除
    v1.erase(v1.begin()+5,v1.end()-2);   
    printk(v1);

    //7.清空
    v1.erase(v1.begin(),v1.end());  //法1
    v1.clear();                     //法2
    printk(v1);  

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

结果输出
在这里插入图片描述

六、vector的数据存取

函数原型

at[int idx]; //返回索引idx所指向的数据
operator[]; //返回索引idx所指向的数据
front(); //返回容器中第一个数据元素
back(); //返回容器中最后一个数据元素

代码示例

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

void printk(vector<int> &v)
{
    for(vector<int>::iterator i = v.begin(); i != v.end(); i++)
    {
        cout<< (*i)<< " ";
    }
    cout << endl;
}
//vector容器的构造函数
void test1()
{
    //默认构造,无参构造
    vector<int>v1;  
    for(int i = 0; i < 10; i++)
    {
        //1.尾插
        v1.push_back(i);
    }
    printk(v1);
    
    //采用at(i)去访问容器元素
    for(int i =0; i< v1.size(); i++)
    {
        cout<< v1.at(i)<<" ";
    }
    cout << endl; 
    //采用[]去访问容器元素
      for(int i =0; i< v1.size(); i++)
    {
        cout<< v1[i]<<" ";
    }
    cout << endl;
    
    //输出容器首部和尾部
    cout<< v1.front()<< endl;
    cout<< v1.back()<< endl;

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

输出结果
在这里插入图片描述

七、vector互换容器

功能描述:实现两个容器的互换,并且可以利用容器互换进行内存收缩
函数原型

swap(vec); //将vec与本身的元素进行互换

代码示例

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

 printk(vector<int> &v)
{
    for(vector<int>::iterator i = v.begin(); i != v.end(); i++)
    {
        cout<< (*i)<< " ";
    }
    cout << endl;
}
//vector容器的构造函数
void test1()
{
    //默认构造,无参构造
    vector<int>v1;  
    for(int i = 0; i < 10; i++)
    {
        //1.尾插
        v1.push_back(i);
    }
    printk(v1);

    vector<int>v2;  
    for(int i = 9; i >= 0; i--)
    {
        //1.尾插
        v2.push_back(i);
    }
    printk(v2);

    //容器互换
    cout<<"容器交换"<<endl;
    v1.swap(v2);
    printk(v1);
    printk(v2); 
}
//利用容器交换进行内存收缩
int main()
{ 
    test1();
    return 0;
}

结果输出
在这里插入图片描述
利用容器互换进行内存收缩

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

void printk(vector<int> &v)
{
    for(vector<int>::iterator i = v.begin(); i != v.end(); i++)
    {
        cout<< (*i)<< " ";
    }
    cout << endl;
}
//利用容器互换进行内存收缩
void test2()
{
     //默认构造,无参构造
    vector<int>v1;  
    for(int i = 0; i < 10000; i++)
    {
        //1.尾插
        v1.push_back(i);
    }
   // printk(v1);

    cout<< "容器的容量为 " <<v1.capacity() <<endl;
    cout<< "容器的实际存储为 " <<v1.size() <<endl;

    v1.resize(3);  //重新修改容器大小
    cout<< "容器的容量为 " <<v1.capacity() <<endl;
    cout<< "容器的实际存储为 " <<v1.size() <<endl;
}
//利用容器交换进行内存收缩
int main()
{ 
    test2();
    return 0;
}

结果输出
在这里插入图片描述
由上面输出可以看出来,最开始申请存储10000个数据,系统给容器分配的容量为16384,而当我重新设置容器大小为3后,系统分配的容量还是16384,这就造成了内存浪费。

解决办法
在这里插入图片描述

vector< int>(v).swap(v); //分两部分
① vector< int>(v)
是一个匿名对象,就是利用拷贝构造函数创建一个新的对象,没有名称,按照v这个容器的实际空间,初始化这个匿名对象,所以一开始,这个匿名对象的大小就是3,容量也是3。
②.swap(v);
调用swap();进行容器的交换,就是把匿名对象和v进行交换
交换后,系统会将匿名对象的内存空间回收

代码示例

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

void printk(vector<int> &v)
{
    for(vector<int>::iterator i = v.begin(); i != v.end(); i++)
    {
        cout<< (*i)<< " ";
    }
    cout << endl;
}
//利用容器互换进行内存收缩
void test2()
{
     //默认构造,无参构造
    vector<int>v1;  
    for(int i = 0; i < 10000; i++)
    {
        //1.尾插
        v1.push_back(i);
    }
   // printk(v1);

    cout<< "容器的容量为 " <<v1.capacity() <<endl;
    cout<< "容器的实际存储为 " <<v1.size() <<endl;

    v1.resize(3);  //重新修改容器大小
    cout<< "容器的容量为 " <<v1.capacity() <<endl;
    cout<< "容器的实际存储为 " <<v1.size() <<endl;
    
    vector<int>(v1).swap(v1);
    cout<< "容器的容量为 " <<v1.capacity() <<endl;
    cout<< "容器的实际存储为 " <<v1.size() <<endl;

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

输出结果
在这里插入图片描述

八、vector预留空间

功能描述:因为vector容器可以进行动态扩内存,而且为了满足我们要插入的数据,可能不知一次的进行动态扩存,因此,为了减少动态扩存的次数,可以使用该功能。
函数原型:

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

代码示例(不预留空间,改变次数)

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

void printk(vector<int> &v)
{
    for(vector<int>::iterator i = v.begin(); i != v.end(); i++)
    {
        cout<< (*i)<< " ";
    }
    cout << endl;
}
//利用容器互换进行内存收缩
void test2()
{
    vector<int>v1;  
    int *p = NULL;  //定义一个指针指向当前容器的首地址
    int num = 0;     //改变次数
    for(int i = 0; i < 100000; i++)    //测试插入100000个数,会动态分配多大的内存
    {
        v1.push_back(i);
         if(p != &v1[0]) 
        {
            p = &v1[0];
            num++;
        }
    }
    cout<< "num = "<< num <<endl;     
}
int main()
{ 
    test2();
    return 0;
}

输出结果为18次
在这里插入图片描述
代码示例(预留空间)

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

void printk(vector<int> &v)
{
    for(vector<int>::iterator i = v.begin(); i != v.end(); i++)
    {
        cout<< (*i)<< " ";
    }
    cout << endl;
}
//利用容器互换进行内存收缩
void test2()
{
    vector<int>v1;  
    //预留空间
    v1.reserve(100000);

    int *p = NULL;  //定义一个指针指向当前容器的首地址
    int num = 0;     //改变次数
    for(int i = 0; i < 100000; i++)    //测试插入100000个数,会动态分配多大的内存
    {
        v1.push_back(i);
         if(p != &v1[0]) 
        {
            p = &v1[0];
            num++;
        }
    }
    cout<< "num = "<< num <<endl;     
}
int main()
{ 
    test2();
    return 0;
}

输出结果为一次
在这里插入图片描述
预留空间就是让系统事先知道我们需要存放多少数据,然后一次性为我们分配内存空间

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

<( ̄︶ ̄)Okay.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值