STL vector
vector 容器和 array 容器非常类似,都可以看做是对普通数组的“升级版”。不同之处在于,array 实现的是静态数组,而 vector 实现的是一个动态数组,即可以进行元素的插入和删除,在此过程中,vector 会动态调整所占用的内存空间,整个过程无需人工干预。
初始化方法
//方法一
std::vector<double> values;
values.reserve(20);//增加容量
//reserce设置了容器的内存分配,即至少可以容纳 20 个元素。需注意,如果调用 reserve() 来增加容器容量,之前创建好的任何迭代器(例如开始迭代器和结束迭代器)都可能会失效,这是因为,为了增加容器的容量,vector<T> 容器的元素可能已经被复制或移到了新的内存地址。所以后续再使用这些迭代器时,最好重新生成一下。
//方法二
std::vector<int> primes {2, 3, 5, 7, 11, 13, 17, 19};
//方法三
std::vector<double> values(20);//指定元素个数,默认为0
std::vector<double> values2(20, 1.0);//指定默认元素为1.0
int num=20;
double value =1.0;
std::vector<double> values3(num, value);//使用变量
//方法四
std::vector<char>value1(5, 'c');
std::vector<char>value2(value1);//通过其他vector
int array[]={1,2,3};
std::vector<int>values3(array, array+2);//values 将保存{1,2}
std::vector<int>value4{1,2,3,4,5};
std::vector<int>value5(std::begin(value1),std::begin(value1)+3);//value2保存{1,2,3}
vector 容器的成员函数
函数成员 | 函数功能 |
---|---|
begin() | 返回指向容器中第一个元素的迭代器。 |
end() | 返回指向容器最后一个元素所在位置后一个位置的迭代器,通常和 begin() 结合使用。 |
rbegin() | 返回指向最后一个元素的迭代器。 |
rend() | 返回指向第一个元素所在位置前一个位置的迭代器。 |
cbegin() | 和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。 |
cend() | 和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。 |
crbegin() | 和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。 |
crend() | 和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。 |
size() | 返回实际元素个数。 |
max_size() | 返回元素个数的最大值。这通常是一个很大的值,一般是 232-1,所以我们很少会用到这个函数。 |
resize() | 改变实际元素的个数。 |
capacity() | 返回当前容量。 |
empty() | 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。 |
reserve() | 增加容器的容量。 |
shrink _to_fit() | 将内存减少到等于当前元素实际所使用的大小。 |
operator[ ] | 重载了 [ ] 运算符,可以向访问数组中元素那样,通过下标即可访问甚至修改 vector 容器中的元素。 |
at() | 使用经过边界检查的索引访问元素。 |
front() | 返回第一个元素的引用。 |
back() | 返回最后一个元素的引用。 |
data() | 返回指向容器中第一个元素的指针。 |
assign() | 用新元素替换原有内容。 |
push_back() | 在序列的尾部添加一个元素。 |
pop_back() | 移出序列尾部的元素。 |
insert() | 在指定的位置插入一个或多个元素。 |
erase() | 移出一个元素或一段元素。 |
clear() | 移出所有的元素,容器大小变为 0。 |
swap() | 交换两个容器的所有元素。 |
emplace() | 在指定的位置直接生成一个元素。 |
emplace_back() | 在序列尾部生成一个元素。 |
代码示范:
#include <iostream>
#include <vector>
using namespace std;
int main(){
//初始化一个空vector容器
vector<char> v;
//添加字符
v.push_back('S');
v.push_back('T');
v.push_back('L');
//输出元素个数
printf("元素个数:%d\n",v.size());
//遍历输出
for(auto i=v.begin();i<v.end();i++){
cout<<*i<<" ";
}
cout<<endl;
//在起始位置插入元素
v.insert(v.begin(),'A');
cout<<"首个元素:"<<v.at(0);
return 0;
}
运行结果:
访问vector中的单个元素
vector<int> values{1,2,3,4,5};
values[0];
values.at(0)
insert()函数使用方法
语法格式 | 用法说明 |
---|---|
iterator insert(pos,elem) | 在迭代器 pos 指定的位置之前插入一个新元素elem,并返回表示新插入元素位置的迭代器。 |
iterator insert(pos,n,elem) | 在迭代器 pos 指定的位置之前插入 n 个元素 elem,并返回表示第一个新插入元素位置的迭代器。 |
iterator insert(pos,first,last) | 在迭代器 pos 指定的位置之前,插入其他容器(不仅限于vector)中位于 [first,last) 区域的所有元素,并返回表示第一个新插入元素位置的迭代器。 |
iterator insert(pos,initlist) | 在迭代器 pos 指定的位置之前,插入初始化列表(用大括号{}括起来的多个元素,中间有逗号隔开)中所有的元素,并返回表示第一个新插入元素位置的迭代器。 |
#include <iostream>
#include <vector>
#include <array>
using namespace std;
int main()
{
std::vector<int> demo{1,2};
//第一种格式用法
demo.insert(demo.begin() + 1, 3);//{1,3,2}
//第二种格式用法
demo.insert(demo.end(), 2, 5);//{1,3,2,5,5}
//第三种格式用法
std::array<int,3>test{ 7,8,9 };
demo.insert(demo.end(), test.begin(), test.end());//{1,3,2,5,5,7,8,9}
//第四种格式用法
demo.insert(demo.end(), { 10,11 });//{1,3,2,5,5,7,8,9,10,11}
for (int i = 0; i < demo.size(); i++) {
cout << demo[i] << " ";
}
return 0;
}
emplace()函数使用方法
//emplace() 每次在指定位置之前只能插入一个元素
emplace (const_iterator pos, args...);
//pos 为指定插入位置的迭代器;args... 表示与新插入元素的构造函数相对应的多个参数
注:emplace()函数运行效率更高