系列文章目录
C++基础语法
C++面向对象
STL基础
STL-vector
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()的区别
- 相比push_back,如果传入临时对象T(1),则没有区别,都会调用emplace_back,并通过move,如果传入1,那么push_back则需要两步,先构造函数,再move,而emplace_back则只需要最后调用构造函数
- 由于其构造函数的特殊性,支持传入多个参数,通过默认构造函数生成右值,并完成构造(push_back也可以)
- 与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,允许我们将元素放置在容器头部、一个指定位置之前或容器尾部。