版权声明:本博客为博主原创文章,未经博主允许,禁止转载,谢谢合作。 https://blog.csdn.net/weixin_43971252/article/details/88256840
注: 文章为本人为方便复习而写,若有朋友要参考,本文的不清楚的地方可以留言,也可以参考其他网页。
#include<iostream>
#include<vector>
#include<list>
using namespace std;
//容量与实际数据量
void test_one()
{
vector<int> v;
for (int i(0); i < 15; i++)
{
v.push_back(i);
cout << v.capacity() << endl;
}
cout <<"\n" << v.size() << endl;
//vector为类似动态数组,其容量的分配增长速度不是一个确定值,容量 >= 实际元素个数
}
void printVector(vector<int> v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
cout << *it << " ";
cout << "\n";
}
//初始化和赋值
void test_two() {
//初始化
vector<int> v1{ 10,2,56,90,1000 };
printVector(v1);
vector<int> v2(v1.begin(), v1.end()); //把v1.begin()到v1.end()之间的数据拷贝给v2
printVector(v2);
int arr[5]{ 1,2,3,4,5 };
vector<int> v3(arr, arr + sizeof(arr) / sizeof(int)); //功能类似于上一个
printVector(v3);
vector<int> v4(10, 666); //(n,elem), 将n个elem拷贝给v4
printVector(v4);
//以上调用构造函数初始化
vector<int> v5(v4); //调用拷贝构造函数把v4拷贝给v5
printVector(v5);
//赋值
//1.使用assign会删除容器之前的数据,重写
vector<int> v6;
v6.assign(v1.begin(), v1.end()); //将区间:v1.begin()到v1.end()的数据赋值给v6
printVector(v6); //数据和v1一样
v6.assign(3, 10000); //将删除v6之前的数据,并将n个(3) val(10000)重新写入到v6
printVector(v6);
//2.重载=
vector<int> v7 = v6;
printVector(v7);
//3.swap交换数据
v7.swap(v1); //交换当前vector容器对象v7与v1的数据
printVector(v7);
}
//vector空间大小操作
void test_three()
{
vector<int> v{ 1,2,3,4,5,6 };
printVector(v);
cout << "size : " << v.size() << endl; //返回对象v有多少个有效数据
cout << "capacity : " << v.capacity() << endl;
if (v.empty())
cout << "v为空" << endl;
else
cout << "v非空" << endl;
//resize重新指定容器的长度
//1.v.resize(n),重新指定长度为n,若容器变长,则以默认值(一般为0)填充新位置,若容器变短,则末尾超出长度的元素被删除
v.resize(3);
printVector(v);
v.resize(10);
printVector(v);
//2.v.resize(n,elem),若容器变长,则用elem填充新位置,若容器变短,末尾超出指定的长度的元素被删除
v.resize(7, 6); //容器变短不重写: 1 2 3 0 0 0 0
printVector(v);
v.resize(10, 6);
printVector(v);
}
//注:数据量很大时可以用reserve预留出空间,避免多次开辟空间
//用swap收缩容器对象空间
void test_swap()
{
vector<int> v;
for (int i(0); i < 1000; i++)
v.push_back(i);
cout << "capacity of v : " << v.capacity() << endl;
cout << "size of v : " << v.size() << endl;
v.resize(10);
cout << "capacity of v : " << v.capacity() << endl; //没有变化
cout << "size of v : " << v.size() << endl; //变为10
//匿名对象的空间为10,使用swap交换了v与匿名对象的空间,实现将对象v的空间收缩
vector<int>(v).swap(v);
cout << "capacity of v : " << v.capacity() << endl; //变为10
cout << "size of v : " << v.size() << endl; //10
}
//读取数据
void test_four(){
vector<int> v;
v.push_back(100);
v.push_back(200);
v.push_back(300);
v.push_back(400);
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
cout << *it << " ";
cout << endl;
cout << "第二个数据 : " << v[1] << endl;
cout << "第三个数据 : " << v.at(2) << endl; //使用at越界时会抛出异常,更安全
cout << "第一个数据 : " << v.front() << endl;
cout << "最后一个数据 : " << v.back() << endl;
//vector容器的迭代器支持随机访问
vector<int>::iterator itBegin = v.begin();
itBegin = itBegin + 1; //这样写不报错就表明该容器支持随机访问
itBegin += 2;
list<int> l{ 10,30,49,90 };
list<int>::iterator litBegin = l.begin();
//litBegin = litBegin + 1; //error 因为链表容器没有重载迭代器加法操作
}
//插入和删除
void test_five()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
//insert( , , ):第一个参数是要插入的位置(一个迭代器值),第二个参数为插入的数据的个数,第三个参数为插入数据的值
v.insert(v.begin(), 66); //在迭代器起始位置可以实现前插
printVector(v);
v.insert(v.begin() + 1, 2, 888);
printVector(v);
v.pop_back(); //删除vector容器对象里的最后一个元素
printVector(v);
//erase删除指定位置(迭代器值即指针)或者指定区间[first,last)的数据,不包括last
v.erase(v.begin());
printVector(v);
v.erase(v.begin(), v.begin() + 1); //等价于v.erase(v.begin());
printVector(v);
//清除所有数据
v.clear();
if (v.empty())
cout << "v已经清空" << endl;
}
//逆序遍历
void reverseprint() {
vector<int> v{ 1,2,3,4,5,6 };
//使用逆序迭代器:reverse_iterator
for (vector<int>::reverse_iterator rit = v.rbegin(); rit != v.rend(); rit++)
cout << *rit << " ";
cout << "\n";
}
int main()
{
//test_one();
//test_two();
//test_three();
//test_swap();
//test_four();
//test_five();
reverseprint();
cin.get();
return 0;
}