vector类是一个能够存放各种数据类型的动态数组,熟练掌握vector能够帮助我们帮一些问题简单化。
vector的头文件#include <vector>
一.vector类的构造
1.无参构造
2.初始化n个值的构造
3.拷贝构造
4.用区间构造
5.迭代器构造
int main()
{
vector<int>v1;
vector<int>v2(10,2);//10个2的数组
vector<char>v1(10,'c');
vector<int>v3(v2);
int arr[] = { 1, 2, 3, 4, 5 };
vector<int>v4(arr,arr+5);
vector<int>v5(v4.begin()+1,v4.end()-1);
vector<int>::iterator it = v5.begin();
while (it != v5.end())
{
cout << *it<<" ";
it++;
}
cout << endl;
return 0;
}
注:
vector (size_type n, const value_type& val = value_type())在构造时,不传val默认值为0,传了参数以值为参数
二.vector类的容量,大小操作
1.size
2.capacity
3.empty
4.clear
5.reserve
6.resize
int main()
{
vector<int>v(10, 2);
cout << v.size() << endl;
cout << v.capacity() << endl;
cout << v.empty() << endl;
v.reserve(20);
cout << v.capacity() << endl;
v.resize(15,5);
cout << v.size() << endl;
vector<int>::iterator it = v.begin();
while (it != v.end())
{
cout << *it << " ";
it++;
}
cout << endl;
v.clear();
it = v.begin();
while (it != v.end())
{
cout << *it << " ";
it++;
}
cout << endl;
return 0;
}
注:
1.clear()只是将string中有效字符清空,不改变底层空间大小。
2.resize (size_type n, value_type val = value_type()),n<=size(),取数组的前n个,当n>size(),不传val默认为0,传参数为参数。
3.reserve(size_t n):改变容量,当n>capacity时,增加容量,n<=capacity时,不会减少容量,即容量只增不减。
所以实际和string的用法一样
三.vector类的访问
1.operator [ ] 访问
2.迭代器
int main()
{
int arr[] = {1,2,3,4,5,6,7};
vector<int>v(arr,arr+7);
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
vector<int>::iterator it = v.begin();
while (it != v.end())
{
*it *= 2;
it++;
}
it = v.begin();
while (it != v.end())
{
cout << *it<<" ";
it++;
}
cout << endl;
vector<int>::reverse_iterator rit = v.rbegin();
while (rit != v.rend())
{
cout << *rit << " ";
rit++;
}
cout << endl;
return 0;
}
四.vector类的增删查改
1.push_back
2.pop_back
3.insert
4.erase
5.swap
int main()
{
vector<int>v;
for (int i = 1; i <= 10; i++)
{
v.push_back(i);
}
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
v.pop_back();
v.pop_back();
v.pop_back();
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
insert四种插入方式
v.insert(v.begin(),10);//在开头插入10
v.insert(v.end(), 20);//在末尾插入20
v.insert(v.begin(),5,100);//在开头插入5个100
int arr[] = { 1, 2, 3, 4, 5 };
v.insert(v.begin(),arr,arr+5);//在开头插入这个数组
vector<int>v1(10,0);
v.insert(v.end(),v1.begin(),v1.end());//在结尾插入另个一vector里的内容
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
erase删除的两种方式
v.erase(v.begin());//删除某一个位置的值
v.erase(v.begin()+2,v.end()-2);//删除区间内的值
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
交换的方法
v.swap(v1);
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
cout << endl;
return 0;
}
注:
在一个位置插入数据,都是在该位置前插入数据,比如insert(v.begin()+2,5),即插入过后在begin()+2的位置是5,而原本在begin()+2位置的值向后移动,这是STL的默认规定,都是在位置前插入数据
五.find(属于算法,不属于vector类的接口)
template <class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val),在first和last区间内找val值,找到返回val的所在位置的迭代器,找不到返回last的迭代器
值得注意的是这个区间是左闭右开的,即 [first,last),
int main()
{
int arr[] = { 1, 2, 3, 4, 5 };
vector<int>v(arr, arr + 5);
vector<int>::iterator it = find(v.begin(),v.begin()+2,2);
cout << *it << endl; //输出2
it = find(v.begin(),v.end(),5);
cout << *it << endl; //输出3
return 0;
}