STL—vector
<vector> 是 C++ STL 中一个非常有用的容器,它提供了动态数组的功能,使得元素的添加和删除变得更加灵活和方便。
一、vector容器的定义和初始化
vector<int> vec1; // 空的vector,数据类型为int
vector<int> vec2(4); // 4个值为0的vector
vector<int> vec3 (4,10); // 4个值为10的vector [10 10 10 10]
vector<int> vec4 (vec3.begin(),vec3.end()); // [10 10 10 10]
vector<int> vec5 (vec3); ////将向量vec3赋值给向量vec5,即向量vec5等于向量vec3
vector<int> vec6 = {10, 20, 30, 40}; // [10 20 30 40]
int b[]={1,2,3,4,5,6,7};
vector<int> vec7(b,b+7);//从数组中获得初值
二、常用内置函数
1.assign()函数,对已定义好的vector向量进行赋值。比如:
a.assign(b.begin(), b.begin()+3); //将b的下标为0-2的元素赋值给向量a
a.assign(4,2); //使向量a变为长度为4且值为2
2.back() 函数。返回vector的最后一个元素
3.front()函数。返回vector的第一个元素
4.a[i]。返回a的第i个元素,当且仅当a存在
5.clear()函数。清空vector中的元素
6.empty()函数。//判断向量vecotr是否为空,若为空空则返回true,非空则返回false。
7.push_back()函数。向vector的最后插入一个新的元素。例如:
a.push_back(5); //在向量a的最后插入一个元素,其值为5。
8.pop_back() 函数。删除vector 中最后一个元素。
9.erase()函数。删去容器中指定位置的元素,容器的size(大小)会改变,但是容器的容量不变。例如:
a.erase(a.begin(), a.end()); //删除a向量中全部元素
a.erase(a.begin(), a.begin()+3);//删除a向量中下标0-2共三个元素
10.insert()函数。在指定位置插入新元素。
v2.insert(v2.begin(),20);//在指定位置插入数据
v2.insert(v2.begin(),3,10);//在指定位置插入多次重复数据
v2.insert(v2.begin(),v1.begin(),v1.end());//在指定位置插入另外一个vecotr的数据
11.size()函数。返回向量中元素的个数
12.capacity()函数。在发生realloc(动态分配)前能允许的最大元素数,即预分配的内存空间。
13.resize()函数。调整元素个数。例如:
a.resize(10);//将a的现有元素个数调整至10个,多则删,少则补,其值随机
a.resize(10, 2);//将a的现有元素个数调整至10个,多则删,少则补,其值为2
14.reserve() 函数。
a.reserve(100); //将a的容量扩充至100
15.swap() 函数
a.swap(b); //b为向量,将a中的元素和b中的元素整体交换
16.vector比较操作。
a == b; //相等
a > b; //大于
a >= b; 大于等于
a < b; //小于
a <= b; //小于等于
a != b; //不等于
三、常用的操作函数
1.sort()函数。
sort(a.begin(), a.end()); //对向量a进行从小到大排序
2.reverse() 函数
//对a中的元素从a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列
reverse(a.begin(), a.end()); //如a中元素为1,3,2,4,倒置后为4,2,3,1
3.copy() 函数
//把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开始复制,覆盖掉原有元素
copy(a.begin(), a.end(), b.begin()+1);
4.find() 函数
//在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,
//若存在返回其在向量中的下标,不存在则返回end(),即向量最后一个元素下标加一
find(a.begin(), a.end(), 4);
四、vector的遍历
1.重载[]
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
2.迭代器
//正向迭代器
vector<int>::iterator it = v1.begin();
while(it != v1.end())
{
cout << *it << ” “;
it++;
}
cout << endl;
//反向迭代器
|vector<int>::reverse_iterator rit = v1.rbegin();
while (rit != v1.rend())
{
cout << *rit << ” “;
rit++;
}
cout << endl;
3.范围for
for (auto i:v1)
{
cout << i << ” “;
}
cout << endl;
五、容量操作
|
Name |
Description |
|---|---|
|
size |
返回当前vector使用数据量的大小 |
|
max_size |
返回vector最大可用的数据量 |
|
resize |
调整vector中的元素个数 |
|
capacity |
返回vector中总共可以容纳的元素个数 |
|
empty |
测试vector是否是空的 |
|
reserve |
控制vector的预留空间 |
|
shrink_to_fit |
减少capacity到size的大小 |
void vector_test3()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
cout << “v1.size =” << v1.size() << endl;
cout << “v1.capacity =” << v1.capacity() << endl;
v1.reserve(30);
cout << “v1.size =” << v1.size() << endl;
cout << “v1.capacity =” << v1.capacity() << endl;
v1.resize(20);
cout << “v1.size =” << v1.size() << endl;
cout << “v1.capacity =” << v1.capacity() << endl;
v1.resize(35);
cout << “v1.size =” << v1.size() << endl;
cout << “v1.capacity =” << v1.capacity() << endl;
v1.shrink_to_fit();
cout << “v1.size =” << v1.size() << endl;
cout << “v1.capacity =” << v1.capacity() << endl;
}
四、增删查改
| 接口函数 | 功能说明 |
|---|---|
| assign | 新内容覆盖旧内容并调整size |
| push_back | 尾插 |
| pop_back | 尾删 |
| insert | 任意位置插入 |
| erase | 任意位置删除 |
| swap | 和另一个vector交换数据 |
| clear | 清空数据 |
五、迭代器
|
Name |
Description |
|---|---|
|
begin |
返回指向迭代器第一个元素的指针 |
|
end |
返回指向迭代器最后一个元素的指针 |
|
rbegin |
返回迭代器逆序第一个元素的指针 |
|
rend |
返回迭代器逆序最后一个元素的指针 |
|
cbegin |
返回常量迭代器的第一个元素的指针 |
|
cend |
返回常量迭代器的最第一个元素的指针 |
|
crbegin |
返回常量迭代器逆序的第一个元素的指针 |
|
crend |
返回常量迭代器逆序的最后一个元素的指针 |
