C++:渴望力量吗,少年?
??vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
注意:使用vector需要包含头文件 < vector >
函数名称 | 功能说明 |
---|---|
vector()(重点) | 无参构造 |
vector(size_type n, const value_type& val = value_type()) | 构造并初始化n个val |
vector (const vector& x); (重点) | 拷贝构造 |
vector (InputIterator first, InputIterator last); | 使用迭代器进行初始化构造 |
iterator的使用 | 接口说明 |
---|---|
begin + end(重点) | 获取第一个数据位置的iterator/const_iterator, 获取最后一个数据的下一个位置的iterator /const_iterator |
rbegin + rend | 获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterator |
容量空间 | 接口说明 |
---|---|
size | 获取数据个数 |
capacity | 获取容量大小 |
empty | 判断是否为空 |
resize(重点) | 改变vector的size |
reserve (重点) | 改变vector的capacity |
函数名称 | 功能说明 |
---|---|
push_back(重点) | 尾插 |
pop_back (重点) | 尾删 |
?nd | 查找并返回位置 |
insert | 在position之前插入val |
erase | 删除position位置的数据 |
swap | 交换两个vector的数据空间 |
operator[ ] (重点) | 可以像数组一样访问 |
代码如下:
#include<iostream>
#include<vector>
using namespace std;
void test_vector1()
{
cout << "我是 test_vector1()" << endl;
vector<int> v1;
vector<int> v2(10, 0);//内容是10个0
vector<int> v3(v2.begin(), v2.end());//可以用迭代器初始化
string str("hello world");
vector<int> v4(str.begin(), str.end());//也可以用其他容器的迭代器初始化
vector<int> v5(v4);//拷贝构造
//遍历
for (size_t i = 0; i < v3.size(); i++)
{
cout << v3[i] << " ";//运算符重载
}
cout << endl;
//vector<int>::iterator it = v4.begin();
auto it = v4.begin();//迭代器遍历
while (it != v4.end())
{
cout << *it << " ";
++it;
}
cout << endl;
for (auto e : v5)//范围for遍历(本质上还是迭代器)
{
cout << e << " ";
}
cout << endl;
cout << endl;
}
void test_vector2()
{
cout << "我是 test_vector2()" << endl;
size_t sz;
vector<int> v;
//v.reserve(55);//1可以提前将空间设置足够,就可以避免边插入边扩容导致效率低下的问题了
sz = v.capacity();
cout << "making v grow:\n";
for (int i = 0; i < 100; ++i)//查看扩容的具体数据
{
v.push_back(i);
if (sz != v.capacity())
{
sz = v.capacity();
cout << "capacity changed: " << sz << '\n';
}
}
//vs下使用的STL基本是按照1.5倍方式扩容
cout << endl;
}
void test_vector3()
{
cout << "我是 test_vector3()" << endl;
vector<int> v1;
cout << v1.max_size() << endl;//没啥用
vector<int> v;
//v.reserve(100); // size = 0 capacity 100
v.resize(100); // size = 100 capacity 100
for (size_t i = 0; i < 100; i++)
{
v[i] = i;//如果是注释上面的v.resize(100),取消对v.reserve(100)的注释仍会报错
//虽然空间是开出来了,但是因为这个运算符重载包含对下标的断言,超过size就报错
}
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
cout << endl;
}
void test_vector4()
{
cout << "我是 test_vector4()" << endl;
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
v.insert(v.begin(), 0);//和string一样,效率不高,不建议经常使用
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
auto it = find(v.begin(), v.end(), 3);//在首尾之间找数字3并返回下标
if (it != v.end())
{
v.insert(it, 30);//在3前面插入30
}
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
it = find(v.begin(), v.end(), 3);
if (it != v.end())
{
v.erase(it);//删除元素
}
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
cout << "Before clear:" << endl;
cout << v.size() << endl;
cout << v.capacity() << endl;
v.clear();//清除内容,容量还在
cout << "After clear:" << endl;
cout << v.size() << endl;
cout << v.capacity() << endl;
v.shrink_to_fit();//缩容至合适的容量,不怎么使用
cout << "After shrink_to_fit:" << endl;
cout << v.size() << endl;
cout << v.capacity() << endl;
cout << endl;
}
int main()
{
test_vector1();
test_vector2();
test_vector3();
test_vector4();
return 0;
}
vector的使用和string差不多,其余操作可以自行查阅或者参考之前的文章:
String类(上)
String类(中)