C++STL —— vector

vector容器--一个动态数组,可以存储任意类型的元素,并有一系列方便的操作函数

与普通数组区别:数组是静态空间,而vector可以动态拓展

特点

  • 动态大小:根据需要自动调整大小

    • 动态拓展:并不是在原空间上接新空间,而是找一个更大的内存空间,然后将原数据拷贝到新空间,然后释放原空间

  • 连续存储:元素在内存中是连续存储的,这使得对元素访问非常高效

  • 随机访问:类似数组一样可以通过索引进行随机访问

  • 尾部插入和删除:提供了快速的尾部插入和删除操作

构造函数

功能描述:创建vector容器

函数原型:

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

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

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

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

赋值操作

给vector容器进行赋值

函数原型:

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

assign(beg,end) //将[beg,end)区间数据拷贝赋值给本身

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

vector容量和大小

对vector容器的容量和大小进行操作

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

  • capacity(); //容器的容量

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

  • resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。

    //如果容器变短,则末尾超出容器长度的元素被删除。

  • resize(int num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。

    //如果容器变短,则末尾超出容器长度的元素被删除

对vector进行插入和删除

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

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

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

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

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

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

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

数据存取

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

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

  • back() //返回容器最后一个数据元素

互换容器

实现两个容器内元素进行呼唤

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

预留空间

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

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

(频繁push_back和pop_back的解决办法)

还有的解决办法是

  • 使用emplace_back函数,C++11新特性,允许在std::vector末尾直接构造元素,而无需显式创建临时对象或者移动操作,这样可以避免额外的复制和移动开销,提高性能。

  • 使用std::deque容器,双端队列也是新特性,支持在容器两端高效插入和删除,不需要进行内存重新分配和元素赋值,因此在push_back和pop_back时有更好的性能。

遍历方式

for_each接收参数:

template <class InputIt, class UnaryFunction>
UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f);
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
std::vector<int> v = {1,2,3,4,5};
//迭代器
std::vector<int>::iterator pBegin = v.begin();
std::vector<int>::iterator pEnd = v.end();
//第一种遍历方式,通过下标
void print1(){
  for(int i = 0;i<v.size();i++){
    std::cout << v[i] << std::endl;
  }
}
​
//第二种遍历方式,通过迭代器
void print2(){
  for(std::vector<int>::iterator it = pBegin;it!=pEnd;it++){
    std::cout << *it << std::endl;
  }
}
void MyPrint(int val) {
  std::cout << val << std::endl;
}
​
//第三种遍历方式
void print3(){
  for_each(pBegin,pEnd,MyPrint);
}
int main(){
  print1();
  print2();
  print3();
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值