vector 是一个动态增长的数组 使用模板来实现(模板元编程是真的黑科技)
注意:正是因为vector的动态增长,在某些条件下会触发不可预计的错误。比如和动态库一起使用 并使用它作为接口 进行传入传出 一方的数据被另一方更改,动态扩容之后,当函数返回时,申请的空间需要释放,这时会违背 存储在哪边申请哪边释放的原则,导致程序崩溃 如果强行要使用这个接口类型,传入时预定大小即可 注:string也会出现这个问题
1.使用
加入#include <vector>
使用方法都是类似vector<T> name;
//初始化
vector<int> vecTest;
vector<int> vecTest3(10, 0);//使用10个0填充
vector<int> vecTest5(10);//默认10个0填充
vector<int> vecTest2(vecTest);//使用vectest进行初始化
vector<int> vecTest4(vecTest.begin(), vecTest.end());//使用vectest的开始迭代器和结束迭代器进行初始化
2.迭代器
std::vector<T>::iterator temp = vecTest.begin();//用法
vecTest.begin();//初始迭代器
vecTest.end();//结束迭代器
vecTest.rbegin();//反向开始迭代器
vecTest.rend();//反向结束迭代器
vecTest2.cbegin();//指向常量的开始迭代器
vecTest2.cend();//指向常量的结束迭代器
vecTest2.crbegin();//指向常量的反向开始迭代器
vecTest2.crend();//指向常量的反向结束迭代器
拓展:
//以下两种为指向常量的指针 即只读
const char *p;//*p = '6' 之类会报错
char const *p;
//以下为常指针 即只指向这个内存
char * const p;//p++ 会报错
3.读取元素
vecTest[n] ;//访问n为下标的元素 0为开始
vecTest.at(n);//访问n为下标的元素 0为开始
vecTest.front(); //返回第一个元素的引用
vecTest.back(); //返回最后一个元素的引用
vecTest.data(); //返回第一个元素的指针
//迭代器访问 std::vector<T>::iterator temp = vecTest.begin();
*temp;
//用for访问 for(auto temp : vecTest)
*temp;
4.修改类
vecTest.assign(vecTest2.begin(), vecTest2.end());//将vecTest2赋给vecTest
vecTest.assign(n, 3);//将vecTest2赋给vecTest 填充n个3
int listTemp[] = {1776,7,4};
vecTest.assign (listTemp,listTemp+3); // 从数组之中初始化
vecTest.push_back(3);//在末尾加入元素 会比emplace之类的慢
vecTest.pop_back();//在末尾删除元素
//insert
vecTest.insert(vecTest.end(), 3);//在末尾插入
vecTest.insert(vecTest.end(), 4, 3);
int insertTemp[] = { 1, 2, 3, 4 };
vecTest.insert(vecTest.end(), insertTemp, insertTemp + 4);//使用数组在末尾插入
vecTest.insert(vecTest.end(), vecTest3.begin(), vecTest3.end());//使用迭代器在末尾插入
//erase
vecTest.erase(vecTest.begin());//删除指定位置
vecTest.erase(vecTest.begin(), vecTest.end());
vecTest.swap(vecTest2);//交换
vecTest.clear();//清空
vecTest.emplace(vecTest.begin(), 3);//在指定位置插入
vecTest.emplace_back(100);//在末尾插入
5,allocate
std::vector<int> vectorTest;
int* p;
unsigned int i;
p = vectorTest.get_allocator().allocate(5);
for (i = 0; i < 5; i++) vectorTest.get_allocator().construct(&p[i], i);
for (i = 0; i < 5; i++) std::cout << ' ' << p[i];
std::cout << '\n';
for (i = 0; i < 5; i++) vectorTest.get_allocator().destroy(&p[i]);
vectorTest.get_allocator().deallocate(p, 5);
6.容量类
vectorTest.size();//元素数量
vectorTest.max_size();//能够接收的最大数量
vectorTest.resize(); //改变size
vectorTest.capacity(); //容量
vectorTest.reserve();//保留容量
vectorTest.empty(); //是否为空
vectorTest.shrink_to_fit();//改变capacity去适应size
vector和pair 能够简单的组合一些数据 但感觉struct能更清晰一点
vector<pair<int, int>> userInfo({ make_pair(1, 1) });
auto it = userInfo.begin();
cout << "first " << (*it).first << " second " << (*it).second << endl;
vector和algorithm
vector<int> ag({ 1, 2, 3, 5, 4, 1, 7 });
reverse(ag.begin(), ag.end());
sort(ag.begin(), ag.end());
auto it = find(ag.begin(), ag.end(), 7);
cout << *it << endl;