🔥元素获取
vector对象的元素同时支持以下几种元素获取方式
==operator[ ]重载,at访问,front获取首元素,back获取尾元素==
operator[]
和at
获取元素的区别:当下标越界时,使用operator[]
获取报错;at
获取抛异常。
代码案例:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> vec({
1,2,3,4 });
for (int i = 0; i < vec.size(); i++) {
cout << vec[i] << " ";
cout << vec.at(i) << " ";
}
cout << endl;
cout << vec.front() << " ";
cout << vec.back() << endl;
return 0;
}
🔥容量接口
通过这些接口可以获取当前对象容量信息。
==size==
size_type size() const;
返回vector中的元素个数。
这个vector对象返回的元素个数size并不一定等于capacity。
代码案例:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> myints;
cout << "0. size: " << myints.size() << '\n';
for (int i = 0; i < 10; i++) myints.push_back(i);
cout << "1. size: " << myints.size() << '\n';
myints.insert(myints.end(), 10, 100);
cout << "2. size: " << myints.size() << '\n';
myints.pop_back();
cout << "3. size: " << myints.size() << '\n';
return 0;
}
==capacity==
size_type capacity() const;
获取vector对象的容量大小。当你对vector对象执行元素插入,空间不够时,会自动改变capacity并扩容。
代码案例:
// 比较size和capacity
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> myvector;
// set some content in the vector:
for (int i = 0; i < 100; i++) myvector.push_back(i);
cout << "size: " << (int)myvector.size() << '\n';
cout << "capacity: " << (int)myvector.capacity() << '\n';
return 0;
}
有关size和capacity的大小问题,不同编译器的实现不同,运行上面代码过程中产生的结果也可能不同。
但任何情况下,size都是小于等于capacity的。
==reserve==
void reserve (size_type n);
reserve可以用来改变vector对象的容量capacity。
但不会影响size以及当前对象已有元素。
代码案例:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v({
1,2,3,4 });
cout << v.size() << endl;
cout << v.capacity() << endl;
cout << endl;
v.reserve(30);
cout << v.size() << endl;
cout << v.capacity() << endl;
return 0;
}
==resize==
void resize (size_type n, value_type val = value_type());
resize可以用来改变vector的size。
当n小于size时,将内容减少到其前n个元素,删除超出它们的元素。
当n大于size时,对于vector对象中已经存在的元素不做改动,对于尚未定义的元素空间用val填充。
当n大于capacity时,则会重新分配内存空间(扩容)。
代码案例:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v({
1,2,3,4 });
cout << v.size() << endl;
cout << v.capacity() << endl;
cout << endl;
v.resize(15, -1);
cout << v.size() << endl;
cout << v.capacity() << endl;
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
return 0;
}
reserve负责开辟空间,当知道需要多少空间时,可以帮助缓解vector增容的代价。
resize在开辟空间时会初始化,同时影响size。reserve和resize都不会进行缩容,如果有缩容需要,可以使用
shrink_to_fit();
。
==empty==
判断vector对象是否为空,为空返回1,非空返回0。简单说:判断size是否为0。
🔥vector对象增删查改
==push_back==
尾插一个元素,capacity不够时自动扩容。
==pop_back==
尾删一个元素。
代码案例:
#include<vector>
using namespace std;
int main()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
cout << v[v.size() - 1] << " ";
v.pop_back();
cout << v[v.size() - 1] << " ";
v.pop_back();
cout << v[v.size() - 1] << " ";
cout << endl;
cout << v.size() << endl;
return 0;
}
==insert==
insert用于在指定位置插入元素。
此方法有三个重载形式:
single element (1)
iterator insert (iterator position, const value_type& val);
将元素val插入到迭代器position指向的元素之前。
如果position指向end();
迭代器,则将元素添尾插。
同时,此函数存在一个返回值,指向新插入的元素。
fill (2)
void insert (iterator position, size_type n, const value_type& val);
此方法在position指向元素之前插入n个val元素。
无返回值
range (3)
template <class InputIterator>
void insert (iterator position, InputIterator first, InputIterator last);
此方法将位于[first,last)
区间的元素按顺序插入到position指向的元素之前。
无返回值。
代码案例:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v({
1,2,3,4 });
vector<int>::iterator it = v.begin() + 1;
// (1)
it = v.insert(it, 100);
for (auto e : v) cout << e << " ";
cout << endl;
// (2)
v.insert(it, 3, 0);
for (auto e : v) cout << e << " ";
cout << endl;
// (3)
v.insert(v.end(), v.begin() + 1, v.begin() + 4);
for (auto e : v) cout << e << " ";
cout << endl;
return 0;
}
==erase==
可以删除一个迭代器指向的元素,也可以删除一个迭代器区间内的元素。
iterator erase (iterator position);
iterator erase (iterator first, iterator last);
这两个函数都存在一个返回值,返回被删除部分的下一个元素(如果没有下一个元素,则为end()
)的迭代器。
代码案例:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v({
1,2,3,4 });
vector<int>::iterator it = v.begin() + 1;
cout << *it << " ";
it = v.erase(it);
cout << *it << endl;
it = v.erase(it, v.end());
if (it == v.end())
cout << "it == v.end()" << endl;
return 0;
}
==clear==
删除vector对象中的所有元素,同时将size置零。
代码案例:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v({
1,2,3,4 });
cout << v.size() << endl;
for (auto e : v)cout << e << " ";
cout << endl;
v.clear();
cout << v.size() << endl;
for (auto e : v)cout << e << " ";
cout << endl;
return 0;
}
结语
vector相比string来说接口少了很多,也有很多逻辑相同之处,所以有些内容就没有细讲。使用oj刷题时,常常会用到vector,所以熟练掌握vector接口是非常必要。更详细的内容大家也可以参考STL文档,后期还有一些比较重要的非成员函数重载,都会纳入我们的讲解范围。
本篇博客的内容到这里就结束了,博主后续还会继续分享STL相关的内容,感谢大家的支持!♥