STL库Vector容器
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。
可以简单的认为,向量是一个能够存放任意类型的动态数组。
1. 构造函数
- vector() // 创建一个空vector
- vector(int nSize) // 创建一个vector,元素个数为nSize(值默值:int类型0,char类型’ (空)‘)
- vector(int nSize,const T& t) // 创建一个vector,元素个数为nSize,且值均为t
- vector(const vector&) // 拷贝构造函数
- vector(begin,end) // 复制[begin,end)区间内另一个数组的元素到vector中
int main() {
//------------------ vector() :创建一个空vector
vector <char>v2;
cout << v2.empty() << endl; // 1(空)
//------------------ vector(int nSize): 创建一个vector, 元素个数为nSize
vector<int> v3(5);
cout << v3.size() << endl; // 5
for (int i = 0; i < v3.size(); ++i) {
cout << v3[i] << " "; // 0 0 0 0 0
}
vector<char> v3a(5);
cout << v3a.size() << endl; // 5
for (int i = 0; i < v3a.size(); ++i) {
cout <<"v3a:" << v3a[i] << " "; // v3a: v3a: v3a: v3a: v3a: (空)
}
//------------------ vector(int nSize, const T& t):创建一个vector,元素个数为nSize, 且值均为t
vector<int> v1(5, 2);
for (int i = 0; i < v1.size(); ++i) {
cout << v1[i] << " "; // 2 2 2 2 2
}
//------------------ vector(const vector&):拷贝构造函数
vector<int> v4a(3, 2); // 3个2
vector<int> v4b(2, 9); // 2个'9'
v4b = v4a; // 注意:赋值要求复制对象和被复制对象类型一致,否则编译报错
for (int i = 0; i < v4b.size(); ++i) {
cout <<"v4b:"<< v4b[i] << " "; // v4b:2 v4b:2 v4b:2
}
for (int i = 0; i < v4a.size(); ++i) {
cout << "v4a:" << v4a[i] << " "; // v4a:2 v4a:2 v4a:2
}
return 0;
}
2. 增加
2.1 push_back()
void push_back(const T& x); // 向量尾部增加一个元素X
2.2 insert()
- iterator insert(iterator it,const T& x)://向量中迭代器指向元素前增加一个元素x
- iterator insert(iterator it,int n,const T& x)://向量中迭代器指向元素前增加n个相同的元素x
- iterator insert(iterator it,const_iterator first,const_iterator last)://向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
int main() {
//------------------ push_back() 函数:尾部插入元素
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
for (int i = 0; i < v1.size(); ++i) {
cout << v1[i] << " ";
}
//------------------ insert(iterator it,const T& x) :不去重,只是单纯的在尾部插入元素
vector<char> v2;
v2.insert(v2.begin(),'0'); // 向量中迭代器指向元素前增加一个元素'0'
v2.insert(v2.begin()+1, '1');
v2.insert(v2.begin()+2, '2');
v2.insert(v2.begin() + 3, '1');
v2.insert(v2.begin() + 4, '3');
for (int i = 0; i < v2.size(); ++i) {
cout << "v2:"<< v2[i] << " "; // v2:0 v2:1 v2:2 v2:1 v2:3
}
//------------------ insert(iterator it,int n,const T& x): 向量中迭代器指向元素前增加n个相同的元素x
vector<int> v3;
v3.insert(v3.begin(), 2,3);
for (int i = 0; i < v3.size(); ++i) {
cout << "v3:" << v3[i] << " "; // v3:3 v3:3
}
//------------------ insert(iterator it,const_iterator first,const_iterator last)://向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
vector<int> v4a;
vector<int> v4b;
v4b.push_back(1);
v4b.push_back(2);
v4b.push_back(3);
v4a.push_back(66);
v4a.push_back(55);
v4a.push_back(44);
v4a.insert(v4a.begin(),v4b.begin(), v4b.end());
for (int i = 0; i < v4a.size(); ++i) {
cout << "v4a:" << v4a[i] << " "; // v4a:1 v4a:2 v4a:3 v4a:66 v4a:55 v4a:44
}
return 0;
}
3. 删除
3.1 erase()
- iterator erase(iterator it): //删除向量中迭代器指向元素,返回删除元素的下一个元素的迭代器
- iterator erase(iterator first,iterator last): //删除向量中[first,last)中元素
3.2 pop_back()
void pop_back(): //删除向量中最后一个元素
3.3 clear()
void clear(): //清空向量中所有元素
3.4 代码演示
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
int main() {
//------------------ erase(iterator it); //删除向量中迭代器指向元素
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
vector<int>::iterator it;
it=v1.erase(v1.begin()); // 返回删除元素的下一个元素的迭代器
cout <<"the next is : "<< *it << endl; // the next is : 2
for (int i = 0; i < v1.size(); ++i) {
cout << v1[i] << "\t"; // 2 3
}
//------------------ erase(iterator it); //删除向量中迭代器指向元素
vector<int> v2;
v2.push_back(1);
v2.push_back(2);
v2.push_back(3);
v2.push_back(4);
v2.push_back(5);
vector<int>::iterator fist = v2.begin()+2;
vector<int>::iterator last = v2.end();
v2.erase(fist, last);
for (int i = 0; i < v2.size(); ++i) {
cout << v2[i] << "\t"; // 1 2
}
//------------------ pop_back() //删除向量中最后一个元素
vector<int> v3;
v3.push_back(1);
v3.push_back(2);
v3.push_back(3);
v3.push_back(4);
v3.push_back(5);
v3.pop_back();
for (int i = 0; i < v3.size(); ++i) {
cout << v3[i] << "\t"; // 1 2 3 4
}
//------------------ clear(): //清空向量中所有元素
vector<int> v5;
v5.push_back(1);
v5.push_back(2);
v5.push_back(3);
v5.push_back(4);
v5.clear();
for (int i = 0; i < v5.size(); ++i) {
cout << v5[i] << "\t"; // (空)
}
return 0;
}
4. 查——遍历函数
4.1 at( )
reference at(int pos); // 返回pos位置元素的引用
4.2 front()
reference front(); // 返回首元素的引用
4.3 back()
reference back(); //返回尾元素的引用
4.4 date()
date() 返回的是首元素的地址(裸指针)
4.5 [ ] 下标访问
4.6 迭代器
- iterator begin(): //返回向量头迭代器指针,指向第一个元素
- iterator end(): //返回向量尾迭代器指针,指向向量最后一个元素的下一个位置
- reverse_iterator rbegin():反向迭代器,指向最后一个元素
- reverse_iterator rend():反向迭代器,指向第一个元素之前的位置
4.7 代码演示
int main() {
//------------------ iterator begin(); //返回向量头迭代器指针,指向第一个元素
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(2);
v1.push_back(6);
cout << v1[4] << endl;//6
cout << v1.at(4) << endl;//6
cout << v1.front() << endl;//1
cout << v1.back() << endl;//6
cout << v1.data() << endl;//006104D0 返回首元素的地址
//------------------ iterator begin(); //返回向量头迭代器指针,指向第一个元素
// 法1
cout << *(v1.begin()) << endl; // 1
// 法2
vector<int>::iterator it = v1.begin();
cout << *it << endl; // 1
//------------------ everse_iterator rbegin():反向迭代器,指向最后一个元素
cout << *(v1.rbegin()) << endl; // 6
return 0;
}
5. 改
swap()交换
void swap(vector&): // 交换两个同类型向量的数据(长度可以不同)
注意:内容全部交换,元素个数不同也会交换
assign()设置值
- void assign(int n,const T& x); //把当前向量替换为n个x
- void assign(const_iterator first,const_iterator last); //把当前向量v4的所有元素替换为向量v5中[first,last)区间内的所有元素(当前向量的长度改变)
代码演示
int main() {
//------------------ swap(vector&); //交换两个同类型向量的数据
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
vector<int> v2;
v2.push_back(9);
v2.push_back(9);
v2.push_back(9);
v2.push_back(10);
v2.push_back(11);
v1.swap(v2);
for (int i = 0; i < v1.size(); ++i) {
cout << "v1="<< v1[i] << " "; // v1=9 v1=9 v1=9 v1=10 v1=11
}
for (int i = 0; i < v2.size(); ++i) {
cout << "v2=" << v2[i] << " "; // v2=1 v2=2 v2=3
}
//------------------ assign(int n,const T& x); //把当前向量替换为n个x
vector<int> v3;
v3.push_back(1);
v3.push_back(2);
v3.push_back(3);
v3.push_back(6);
v3.push_back(6);
v3.push_back(6);
cout << v3.size() << endl; // 6
v3.assign(3, 10);
cout << v3.size() << endl; // 3
for (int i = 0; i < v3.size(); ++i) {
cout << "v3[" <<i<<"]="<< v3[i] << " "; // v3[0]=10 v3[1]=10 v3[2]=10
}
//------------------ assign(const_iterator first, const_iterator last): //把当前向量v4的所有元素替换为向量v5中[first,last)区间内的所有元素(当前向量,长度改变)。
vector<int> v4;
v4.push_back(1);
v4.push_back(2);
v4.push_back(3);
v4.push_back(6);
v4.push_back(6);
v4.push_back(6);
vector<int> v5;
v5.push_back(8);
v5.push_back(8);
v5.push_back(8);
v4.assign(v5.begin() + 1, v5.end());
for (int i = 0; i < v4.size(); ++i) {
cout << "v4[" << i << "]=" << v4[i] << " "; // v4[0]=8 v4[1]=8
}
for (int i = 0; i < v5.size(); ++i) {
cout << "v5[" << i << "]=" << v5[i] << " "; // v5[0]=8 v5[1]=8 v5[2]=8 不变
}
return 0;
}
6. 判空 empty()
bool empty() const:判断向量是否为空,若为空,则向量中无元素
7. 大小函数
size()
int size() const:返回向量中元素的个数
capacity()
int capacity() const:返回当前向量所能容纳的最大元素值
max_size()
int max_size() const:返回最大可允许的vector元素数量值
代码演示
vector<int>v(5);
vector<int>v1;
cout << v.size() << endl; //5
cout << v.capacity() << endl; //5
cout << v1.empty() << endl; //1
cout << v.empty() << endl; //0
v1.push_back(2);
v1.push_back(3);
cout << v1.size() << endl; //2
cout << v1.capacity() << endl; //2
cout << v1.capacity() << endl; //2
cout << v1.empty() << endl; //0
//------------------ max_size()
vector<int>v1a;
v1a.push_back(2);
v1a.push_back(3);
cout << v1a.max_size() << endl; // 1073741823
v1a.push_back(2);
v1a.push_back(3);
cout << v1a.max_size() << endl; // 1073741823