#include"vector_exercise.h"
// 打印方法1
void print_vector_01(vector<int>& arr)
{
for (vector<int>::iterator i = arr.begin(); i != arr.end(); i++)
{
cout << *i << " ";
}
cout << endl;
}
// 打印方法2
void print_vector_02(vector<int>& arr)
{
for (vector<int>::size_type i = 0; i != arr.size(); i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
void vector_construt()
{
vector<int> arr_01;// 无参构造函数
for (int i = 0; i < 10; i++)
{
arr_01.push_back(i); //往数组中插入数值
}
print_vector_01(arr_01); //打印方法1
print_vector_02(arr_01); //打印方法2
if (arr_01.empty())
{
cout << "arr_01 is empty!" << endl;
}
else
{
cout << "arr_01 is not empty!" << endl;
cout << "arr_01的容量:" << arr_01.capacity() << endl;//13,该个数的空间vector会自动管理,一定会比size()返回的大
cout << "arr_01的元素个数:" << arr_01.size() << endl;//10
}
// resize 重新指定大小,若指定的数值是更大,默认用0填充新位置
arr_01.resize(15);
print_vector_02(arr_01); //0 1 2 3 4 5 6 7 8 9 0 0 0 0 0
// 可以利用重载版本替换默认填充,下面的意思是数值空间扩大到20,新填充的位置用10来填充
arr_01.resize(20,10);
print_vector_01(arr_01); //0 1 2 3 4 5 6 7 8 9 0 0 0 0 0 10 10 10 10 10
// resize 重新指定大小,若指定的数值比原有的空间小,超出部分的元素会被删除
arr_01.resize(5);
print_vector_01(arr_01);//0 1 2 3 4
}
void vevtor_push_pop()
{
vector<int> arr;
// 尾插
arr.push_back(10);
arr.push_back(20);
arr.push_back(30);
arr.push_back(40);
arr.push_back(50);
print_vector_02(arr); //10 20 30 40 50
// 尾删
arr.pop_back();
print_vector_01(arr); //10 20 30 40
// 插入
arr.insert(arr.begin(), 100);
print_vector_01(arr); // 100 10 20 30 40
arr.insert(arr.begin(), 2, 1000);
print_vector_01(arr); // 1000 1000 100 10 20 30 40
// 删除
arr.erase(arr.begin());
print_vector_01(arr);// 1000 100 10 20 30 40
// 清空
//arr.erase(arr.begin(),arr.end());
arr.clear();
print_vector_02(arr);//
}
// 数据存取
void vector_access()
{
vector<int> arr; // 创建数组
// 添加元素到数组中
for (int i = 0; i < 10; i++)
{
arr.push_back(i);
}
// 读取数组的方法
// 方法1
for (int i = 0; i < arr.size(); i++)
{
cout << arr[i] << ",";
}
cout << endl;
// 方法2
for (int i = 0; i < arr.size(); i++)
{
cout << arr.at(i) << ",";
}
cout << endl;
cout << "arr的首元素:" << arr.front() << endl;
cout << "arr的末元素:" << arr.back() << endl;
}
void vector_swap()
{
// 原理
vector<int> arr_01;
vector<int> arr_02;
for (int i = 0; i < 10; i++)
{
arr_01.push_back(i);
}
for (int i = 10; i > 0; i--)
{
arr_02.push_back(i);
}
cout << "交换前:" << endl;
print_vector_01(arr_01);// 0 1 2 3 4 5 6 7 8 9
print_vector_01(arr_02);// 10 9 8 7 6 5 4 3 2 1
cout << "交换后:" << endl;
arr_01.swap(arr_02);
print_vector_01(arr_01);// 10 9 8 7 6 5 4 3 2 1
print_vector_01(arr_02);// 0 1 2 3 4 5 6 7 8 9
// 实际案例,收缩内存
vector <int> arr_03;
for (int i = 0; i < 10000; i++)
{
arr_03.push_back(i);
}
cout << "数组的容量:" << arr_03.capacity() << endl;//12138
cout << "数组的元素总量:" << arr_03.size() << endl;//10000
// 此时如果对数组进行收缩,会造成极大的资源浪费,元素只有3个,但容量有12138个
arr_03.resize(3);
cout << "数组的容量:" << arr_03.capacity() << endl;//12138
cout << "数组的元素总量:" << arr_03.size() << endl;//3
// 此时用匿名函数创建小空间来进行替换,来释放空间,匿名函数使用后,系统会自行释放;
vector<int>(arr_03).swap(arr_03);
cout << "数组的容量:" << arr_03.capacity() << endl;//3
cout << "数组的元素总量:" << arr_03.size() << endl;//3
}
void vector_reserve()
{
vector<int> arr;// 创建空数组
// 预留空间
arr.reserve(100000);// 启用该命令后开辟数组空间次数将大幅减少
int count = 0;// 开辟数组空间的次数
int* p = NULL;// 空指针
for (int i = 0; i < 100000; i++)
{
arr.push_back(i);
// 如果指针p指向的不是数组首元素地址,则需要重新指向一次,
// 每重新指向一次,就代表系统重新开辟1次空间地址
if (p != &arr[0])
{
p = &arr[0];
count++;
}
}
cout << "count: " << count << endl;
}
|