#include <iostream>
#include <vector>
using namespace std;


void print_vec(const std::vector<int>& vec)
{
for (auto x : vec) {
std::cout << ' ' << x;
}
std::cout << '\n';
}

int main()
{
vector<int> vecInt;
vecInt.push_back(1);
vecInt.push_back(2);

/////////一.元素访问 /////////////
//1.at会进行越界检查 越界时,会报std::out_of_range的异常 //而[]操作, 会报断言错误, 这个try是抓取不了的
try
{
cout << vecInt.at(2) << endl;
}
catch (std::out_of_range)
{
cout << "存在越界问题" << endl;
}

//2.front() 第一个元素
cout << "第一个元素: " << vecInt.front() << ", 地址: "<< &(vecInt.front())<< endl;
//3.back() 最后一个元素
cout << "最后一个元素: " << vecInt.back() << ", 地址: " << &(vecInt.back()) << endl;
//4. data() 返回第一个元素对应的地址 !!记得带()
cout << "data():" << vecInt.data() << endl;
cout << "data+1:" << vecInt.data() + 1 << endl; //指针加1,就是指向下一个元素.

/////////二.迭代器 /////////////
//1.begin,cbegin 后者返回一个const_iterator,表示所指向的数据不能够修改,类似有常量指针吧.
//2.end, cend 前者指向vector最后元素的后一元素,该元素表现为占位符,访问会导致未定义行为.
//3.rbegin, rcbegin 前者指向容器最后元素,若vector为空,则返回值等于rend().


/////////三.容量 /////////////
//1.empty()
cout << "Is empty?" << vecInt.empty() << endl;
//2.size() 当前vector元素的个数
cout << "size():" << vecInt.size() << endl;
//3.max_size() 此值反映容器大小上的理论上限,可用的RAM总量会影响该值.
cout << "Maximum size of a 'vector' is" << vecInt.max_size() << endl;
//4.reserve(new_cap) 增加vector的容量.若new_cap大于当前的capacity(),则分配新内存,此时所有迭代器和引用都被非法化,否则不做处理.
//reserve()不更改vector的size().
//5.capacity() 返回分配的容量值
cout << "capacity(): " << vecInt.capacity() << endl;
//6.shrink_to_fit请求移除未使用的容量
vector<int> vecInt2;
cout << "default capacity:" << vecInt2.capacity() << endl;
vecInt2.reserve(100);
cout << "after reserve capacity:" << vecInt2.capacity() << endl;
vecInt2.clear();
cout << "after clear capacity:" << vecInt2.capacity() << endl;
vecInt2.shrink_to_fit();
cout << "after shrink_to_fit capacity:" << vecInt2.capacity() << endl;

/////////四.修改器 /////////////
//1.clear() 清空vector,执行后size()为0
//2.insert(pos, n, val),其中n可以省略:表示插入到pos前面,返回值是插入元素的迭代器.
//insert(iterator pos, InputIt first, InputIt last);可以插入容器类型的元素的全部或者部分.
std::vector<int> vec(3, 100);
print_vec(vec);
cout << "capacity1:" << vec.capacity() << endl;

auto it = vec.begin();
it = vec.insert(it, 200);
print_vec(vec);
cout << "capacity2:" << vec.capacity() << endl;

it = vec.insert(it, 2, 300);
print_vec(vec);
cout << "capacity3:" << vec.capacity() << endl;

// "it" 不再合法,获取新值:
it = vec.begin();

std::vector<int> vec2(2, 400);
vec.insert(it + 2, vec2.begin(), vec2.end());
print_vec(vec);
cout << "capacity4:" << vec.capacity() << endl;

int arr[] = { 501,502,503 };
vec.insert(vec.begin(), arr, arr + 3);
print_vec(vec);
cout << "capacity5:" << vec.capacity() << endl;

//3.erase(pos) 移除位于pos的元素
//erase(first, last) 移除范围[first, last)的元素
//会非法化位于擦除点或之后的迭代器,包含end()迭代器.

//4.push_back
//5.pop_back 移除末尾元素
//swap(vector &other) 将内容与other交换.
vector<int> vecInt3;
vecInt3.swap(vecInt);
cout << "vecInt:";
print_vec(vecInt);
cout << "vecInt3:";
print_vec(vecInt3);
return 0;
}


 vector相关操作总结_#include