vector 的常见用法
vector 是“变长数组”,即“长度根据需要而自动改变的数组”。
1. 头文件
#include <vector>
2. vector 的定义
vector<typename> name;
这里的typename可以是任何基本类型,如:int、double、char、结构体、STL标准容器等。
【注意】如果typename也是STL容器,定义的时候要记得在>>符号之间加上空格。
vector<int> name;
vector<node> name; // node是结构体的类型
vector<vector<int> > name; // >>之间要加空格
3. vector 数组的定义
vector<typename> Arrayname[arraySize];
这样 Arrayname[0]~Arrayname[arraySize-1]
中每一个都是一个vector容器。一般用这种方式实现图的边存储。
与vector<vector<int> > name
不同的是,这种写法其中一维长度已经固定为 arraySize,另一维才是“变长”的。
4. vector 容器内元素的访问
(1)通过下标访问
和访问普通数组一样,对一个定义为vector<typename> vi
的 vector 容器来说,直接访问vi[index]
即可,这里下标是从0到vi.size()-1。
(2)通过迭代器访问
定义迭代器:
vector<typename>::iterator it;
这样可以得到迭代器 it,可以通过指针*it来访问 vector 里的元素。
添加容器元素:
vector<int> vi;
for(int i=1;i<=5;++i)
vi.push_back(i); // 在末尾添加元素i
可以通过类似下标和指针访问数组的方式来访问容器内的元素:
vector<int>::iterator it = vi.begin(); // vi.begin()取vi的首元素地址,而it指向这个地址
for(int i=0;i<5;++i)
printf("%d ", it[i])); // 1 2 3 4 5
【注意】vi[i]
和*(vi+i)
、*(vi.begin()+i)
、vi.begin()[i]
是等价的。
end()
函数是取尾元素地址的下一个地址,作为迭代器末尾的标志,不存储任何元素。
for(vector<int>::iterator it = vi.begin();it!=vi.end();it++)
printf("%d ", *it); // 1 2 3 4 5
vector 的迭代器不支持it<vi.end()
写法,因此循环条件只能用it!=vi.end()
(4)通过逆向迭代器访问
for(vector<int>::reverse_iterator it = vi.rbegin();it!=vi.rend();it++)
printf("%d ", *it); // 5 4 3 2 1
5. vector 常用函数实例解析
(1)push_back()
在 vector 后面添加一个元素 x,时间复杂度为 O(1)。
vector<int> vi;
for(int i=1;i<=3;++i) vi.push_back(i); // 将1、2、3依次插入vi末尾
(2)pop_back()
删除 vector的尾元素,时间复杂度为 O(1)。
vector<int> vi;
for(int i=1;i<=3;++i) vi.push_back(i); // 将1、2、3依次插入vi末尾
vi.pop_back(); // 删除vi的尾元素3
(3)size()
获得 vector 中元素的个数,时间复杂度为 O(1)。size()返回的是 unsigned 类型。
vector<int> vi;
for(int i=1;i<=3;++i) vi.push_back(i); // 将1、2、3依次插入vi末尾
printf("%d\n", vi.size()); //3
(4)clear()
清空 vector 中的所有元素,时间复杂度为 O(N)。
vector<int> vi;
for(int i=1;i<=3;++i) vi.push_back(i); // 将1、2、3依次插入vi末尾
vi.clear();
(5)insert()
insert(it, x)用来向 vector 的任意迭代器 it 处插入一个元素 x,时间复杂度 O(N)。
vector<int> vi;
for(int i=1;i<=5;++i) vi.push_back(i); // 此时为1 2 3 4 5
vi.insert(vi.begin()+2, -1); // 将-1插入vi[2]的位置,此时为1 2 -1 3 4 5
(6)erase()
① 删除单个元素
erase(it)
即删除迭代器为it处的元素.
vector<int> vi;
for(int i=5;i<=9;++i) vi.push_back(i); // 此时为5 6 7 8 9
vi.erase(vi.begin()+3); // 删除8,此时为5 6 7 9
② 删除一个区间内所有元素
mp.erase(first, last)
即删除左闭右开区间[first, last)内所有元素。
vector<int> vi;
for(int i=5;i<=9;++i) vi.push_back(i); // 此时为5 6 7 8 9
vi.erase(vi.begin()+1, vi.begin()+4); // 删除vi[1]、vi[2]、vi[3],此时为5 9
如果要删除这个 vector 内的所有元素,正确的写法应该是vi.erase(vi.begin(), vi.end()),vi.end()
就是尾元素地址的下一个地址。更方便的是使用vi.clear()
。
(7) empty()
返回是否 vector 为空。
vector<int> vi;
for(int i=1;i<=5;++i)
vi.push_back(i);
if (g1.empty() == false)
cout << "Vector is not empty";
else
cout << "Vector is empty";
结果为:
Vector is not empty
(8) assign()
用于给 vector 赋值
① 当参数为数值的时候
assign(int x, typename y)
就是给 vector 赋值 为 x 个 y。此时会改变 vector 的 size()
vector<int> vt;
vt.assign(7, 4);
for (int i = 0; i < vt.size(); i++){
cout<<vt[i]<<" ";
}
cout<<endl;
vt.assign(5, 3);
for(int i=0; i<vt.size(); i++){
cout<<vt[i]<<" ";
}
cout<<endl;
结果:
4 4 4 4 4 4 4
3 3 3 3 3
② 当参数为迭代器或者指针时
assign(typename* x, typename* y)
,就是将[x, y)范围内的内容给 vector 初始化,会改变 size()。
vector<int> v1;
int a[] = { 1, 2, 3 };
// assign first 2 values
v1.assign(a, a + 2);
cout << "Elements of vector1 are\n";
for (int i = 0; i < v1.size(); i++)
cout << v1[i] << " ";
vector<int> v2;
// assign first 3 values
v2.assign(a, a + 3);
cout << "\nElements of vector2 are\n";
for (int i = 0; i < v2.size(); i++)
cout << v2[i] << " ";
结果为:
Elements of vector1 are
1 2
Elements of vector2 are
1 2 3
vector<int> v;
v.assign(7, 100);
cout << "Size of first: " << int(v.size()) << '\n';
cout << "Elements are\n";
for (int i = 0; i < v.size(); i++)
cout << v[i] << " ";
// modify the elements
v.assign(v.begin(), v.begin() + 3);
cout << "\nModified VectorElements are\n";
for (int i = 0; i < v.size(); i++)
cout << v[i] << " ";
cout<<endl;
结果为:
Size of first: 7
Elements are
100 100 100 100 100 100 100
Modified VectorElements are
100 100 100
③当参数为数组时
assign({x1, x2, ...})
直接将 vector 初始化为该数组
vector<int> v;
// Initialize v with an initialization list
v.assign({ 1, 2, 3 });
cout << "The list is:" << endl;
for (auto i = v.begin(); i != v.end(); i++)
{
// Printing 1 2 3 as output
cout << *i << " ";
}
结果为:
The list is:
1 2 3
(9) swap()
用于交换两个 vector
vector<int> v1, v2;
v1.push_back(1);
v1.push_back(2);
v2.push_back(3);
v2.push_back(4);
cout << "Vector 1: ";
for (int i = 0; i < v1.size(); i++)
cout << v1[i] << " ";
cout << "\nVector 2: ";
for (int i = 0; i < v2.size(); i++)
cout << v2[i] << " ";
// Swaps v1 and v2
v1.swap(v2);
cout << "\nAfter Swap \nVector 1: ";
for (int i = 0; i < v1.size(); i++)
cout << v1[i] << " ";
cout << "\nVector 2: ";
for (int i = 0; i < v2.size(); i++)
cout << v2[i] << " ";
结果:
Vector 1: 1 2
Vector 2: 3 4
After Swap
Vector 1: 3 4
Vector 2: 1 2