使用条件
首先,如果你想使用STL_容器_vector,头文件应该写成这样:
#include <iostream>
#include <vector>
using namespace std;
向量初始化
void main()
{
vector<int> v0;
vector<int> v1(10);
for (int i = 0; i < v1.size(); ++i)
cout << v1[i] << " ";
cout << endl;
for (auto& e : v1)
cout << e << " ";
cout << endl;
vector<int>::iterator it = v1.begin();
while (it != v1.end())
{
cout << *it << " ";
++it;
}
cout << endl;
}
正向迭代器和反向迭代器
void main()
{
int ar[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
vector<int> v1(ar, ar + 10);
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;
}
向量的大小和向量的容量
void main()
{
int ar[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
vector<int> v1(ar, ar + 10);
cout << "v1_size="<<v1.size() << endl;//计算顺序表大小
cout << "v1_capacity=" << v1.capacity() << endl;//计算顺序表容量
}
修改大小和容量
void main()
{
vector<int> iv;
iv.push_back(1);
iv.push_back(2);
iv.push_back(3);
iv.push_back(4);
iv.push_back(5);
iv.push_back(6);
iv.push_back(7);
cout << "size = " << iv.size() << endl;
cout << "capacity = " << iv.capacity() << endl;
iv.resize(10);//扩大顺序表大小
//iv.reserve(8);//扩大容量大小
cout << "size = " << iv.size() << endl;
cout << "capacity = " << iv.capacity() << endl;
}
void main()
{
vector<int> v1(5, 2);
v1.resize(10, 3);//扩大顺序表大小,多余的用3补上
cout << "size = " << v1.size() << endl;
cout << "capacity = " << v1.capacity() << endl;
for (int i = 0; i<v1.size(); ++i)
cout << v1[i] << " ";
cout << endl;
}
void main()
{
vector<int> v1(5, 1);
v1.reserve(100);//这里首先将顺序表定好容量,就避免了进行太多的扩容操作
for (int i = 1; i <= 100; ++i)
{
v1.push_back(i);
cout << "capacity = " << v1.capacity() << endl;
}
//对于一个顺序表来说,容量在初始化的时候是有限的,但是,当插入的元素越来越多的时候,
//顺序表的容量小于了顺序表的大小,顺序表就要开始扩容,这个扩容工作可不是简单地在顺序表后面开辟空间
//扩容的步骤:①先开辟一个足以放下所有元素的新空间②将旧空间的元素复制到新空间③添加新元素
//④将旧空间的指针指向新空间⑤释放旧空间
//可以看出扩容是一个很费时间的操作,所以一般我们在一开始,就将顺序表的容量合理地定好是很重要的
}
插入数据
void main()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.insert(v1.begin(), 10);//10 1 2。在pos位置之前插入
vector<int>::iterator pos = find(v1.begin(), v1.end(), 1);
v1.insert(pos, 20);//10 20 1 2
for (int i = 0; i<v1.size(); ++i)
cout << v1[i] << " ";
cout << endl;
}
at()函数和越界问题
void main()
{
int ar[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int n = sizeof(ar) / sizeof(ar[0]);
vector<int> iv(ar, ar + n);
for (int i = 0; i <= iv.size(); ++i)
//cout<<iv[i]<<" ";
cout << iv.at(i) << " ";//at函数会进行越界检测,但是[]不会
cout << endl;
}
扩容之后的迭代器失效问题
void main()
{
int ar[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int n = sizeof(ar) / sizeof(ar[0]);
vector<int> iv(ar, ar + n);
cout << "size = " << iv.size() << endl;
cout << "capacity = " << iv.capacity() << endl;
//iv.reserve(20);//这里如果将顺序表的容量扩容为20,在下面尾插20的时候,就不会发生扩容,it也不需要进行重新赋值就能访问
auto it = find(iv.begin(), iv.end(), 5);
cout << "*it = " << *it << endl;
iv.push_back(20);
//迭代器失效问题,可以看出iv是一个大小为十,容量为十的顺序表。
//通过find找到了5的位置,赋给it,这里尾插一个20,超出了容量所以需要扩容
//通过前面我们知道,扩容是重新开辟空间,重新定位指针的,所以这里再对it进行访问,就会发生迭代器失效的问题
//所以我们需要对it重新进行赋值才能访问成功
it = find(iv.begin(), iv.end(), 5);
cout << "*it = " << *it << endl;
}
erase和非法访问问题
int main()
{
int a[] = { 1, 2, 3, 4 };
vector<int> v(a, a + sizeof(a) / sizeof(int));
vector<int>::iterator pos = find(v.begin(), v.end(), 3);
auto it=v.erase(pos);
//cout << *pos << endl; // 此处会导致非法访问
cout << *it << endl;//删除完之后,指针位置不发生改变,而是后面的元素赋值给删除的元素
for (int i = 0; i<v.size(); ++i)
//cout<<iv[i]<<" ";
cout << v.at(i) << " ";
cout << endl;
return 0;
}
删除数组中偶数的问题
int main()
{
vector<int> v{ 1, 2, 3, 4 };
auto it = v.begin();
while (it != v.end())
{
if (*it % 2 == 0)
{
it = v.erase(it);
}
else
++it;
}//删除了顺序表里面的偶数
//过程:①一开始数值是1,指针向后移动指向2。
// ②之后2是偶数,删除之后指针不发生移动。后面的元素前移,顺序表现在是1 3 4,it指针指向3
// ③由于元素是3,所以指针向后移动指向4。
// ④4是偶数删除,指针不发生改变,后面的元素前移,顺序表现在是1 3。it还是指向4,不过这个时候已经没有意义了,因为每erase一次,向量最后的last指针会--。
//cout << *it << endl;//空指针不能访问
for (int i = 0; i<v.size(); ++i)
cout << v[i] << " ";
cout << endl;
return 0;
}