STL基础-vector

系列文章目录

C++基础语法
C++面向对象
STL基础



vector的概念

功能:

  • vector数据结构和数组非常相似,也称为单端数组

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();            //判断容器是否为空
capcity();           //容器的容量
size();              //返回容器中元素的个数
resize(int , num);   //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
                   //如果容器变短,则末尾超出容器长度的元素被删除。
resize(int num , elem)//重新指定容器长度为num,若容器变长,则以elem值填充新位置。

插入和删除操作

函数原型:

push_back(ele);                   //尾部插入
emplace_back(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();   //删除容器中所有元素

emplace_back()与push_back()的区别

  1. 相比push_back,如果传入临时对象T(1),则没有区别,都会调用emplace_back,并通过move,如果传入1,那么push_back则需要两步,先构造函数,再move,而emplace_back则只需要最后调用构造函数
  2. 由于其构造函数的特殊性,支持传入多个参数,通过默认构造函数生成右值,并完成构造(push_back也可以)
  3. 与push_back的区别在于,构造应在容器中完成,而非在容器外完成,所以不需要move或者拷贝构造!

begin函数

函数原型:

iterator begin();
const_iterator begin();

功能:
返回一个当前vector容器中起始元素的迭代器

end函数

函数原型:

iterator end();
const_iterator end();

功能:
返回一个当前vector容器中末尾元素的迭代器

front函数

函数原型:

reference front();
const_reference front();

功能:
返回当前vector容器中起始元素的引用

back函数

函数原型:

reference back();
const_reference back();

功能:
返回当前vector容器中末尾元素的引用

reserve和resize

vector 的reserve增加了vector的capacity,但是它的size没有改变!
resize改变了vector的capacity同时也增加了它的size!
原因如下:
reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素。加入新的元素时,要调用push_back()/insert()函数。
resize是改变容器的大小,且在创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。此时再调用push_back()函数,是加在这个新的空间后面的。

数据存取

对vector中的数据的存取操作
函数原型:

at(int idx);     //返回索引idx所指数据
operator[];     //返回索引idx所指的数据
front();       //返回容器中第一个数据元素
back();       //返回容器中最后一个数据元素
#include<iostream>
using namespace std;
#include<vector>
void test51()
{
	vector<int>v1;
	for (int i = 0; i < 10; i++){
		v1.push_back(i);//尾插
	}

	//using [] to access to the elements
	for (int i = 0; i < v1.size(); i++){
		cout << v1[i] << "   ";
	}
	cout << endl;
	//using at to access to the elements
	for (int i = 0; i < v1.size(); i++){
		cout << v1.at(i) << "   ";
	}
	cout << endl;
	//获取第一个元素
	cout << "第一个元素为:" << v1.front() << endl;
	//获取最后一个元素
	cout << "最后一个元素为:" << v1.back() << endl;
}
int main(){
test51();
	system("pause");
	return 0;
}

互换容器

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

//巧用swap来收缩内存
vector<int>(v).swap(v);
//resize指定大小3
v.resize(3);

预留空间

功能描述:

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

函数原型:

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

C++11更新

emplace_front() emplace() emplace_back()

C++11中,针对顺序容器(如vector、deque、list),新标准引入了三个新成员:emplace_front、emplace和emplace_back,这些操作构造而不是拷贝元素,少调用了一次复制构造函数。这些操作分别对应push_front、insert和push_back,允许我们将元素放置在容器头部、一个指定位置之前或容器尾部。


总结

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值