STL容器_002 _vector 详解
为什么
各方面表现都比较中等, 适用范围广
尾插很快, 查找也比较快
是什么
- 动态数组
-
特点:
- 动态数组, 三个指针控制
- 两倍增长
- 扩充的方法: 不能原地扩充, 因为后面可能会有其他的东西, 必须在 其他地方开辟一块更大的内存
- 提供[]
- 所有的有连续空间的容器都有[]
-
iterator是class类型的
怎么样
制造
- 两倍增长
//push_back() 检查剩余的空间
//有, 继续增长
//没有,计算
//开始是不是0
//是0 放1个
//不是0 分配两倍的空间
//将原来内容拷贝到新的vector (拷贝构造)
//原来的要删掉(析构)
//插进最新push_back的元素
使用
-
初始化
//C11后是用 initializer_list 实现的 vector<int>vec = {1,2,3}; //拷贝 vector<int>vec1(vec); vector<int>vec2(100,5); //100个5 vector<int>vec3(100) //100个0 //直接添加元素(C11) 也是用了 C11 中的 initializer_list vector<int>vec{1,2,3}; //复制数组 int i[5] = {1,2,3,4,5}; vector<int> vec(i,i+5);
-
状态查看(主要是容量)
//返回元素个数 vec.size(); //返回扩容后最多能容纳的元素个数 vec.max_size(); //返回分配的容量 vec.capacity(); //是否为空, 为空就返回true vec.empty();
-
改变capacity与size
//容量设为100 vec.reserve(100); //如果capacity<size 会发生什么? //把容量改成size vec.shrink_to_fit(); //resize少了直接去掉多余的元素, 多了如果指定了数就填充指定的元素, 这里没有指定就默认填充0 //底下最后输出 1 2 3 4 5 100 100 100 0 0 0 0 for (int i=1;i<10;i++) myvector.push_back(i); myvector.resize(5); myvector.resize(8,100); myvector.resize(12);
-
改变 / 查看元素(不改变size)
//[] vec[8] = vec[10]; //at vec.at(10) = vec.at(9); //返回最前一个或最后一个元素, 可以作为左值 myvector.front() -= myvector.back(); //data该函数返回一个指向数组中第一个元素的指针,该指针在向量内部使用 vec.data();
- 小伙伴们应该看出来了, 上面前三个既可以作为左值; 也可以作为右值
-
更易型操作(改变size)
//尾插 vec.push_back(5); vec.emplace_back(5);//在末尾直接生成, 也许比push_back快一点点. 据说可以初始化对象的多个成员. //尾删 vec.pop_back(); //插入元素 //往迭代器指向的前面开始插入元素 (这很好理解,考虑到end,不可能是向后) , 返回第一个插入元素的位置 vec.insert(vec.begin,2,3); //在前面插入2个3 vec.insert(vec.begin()+1,vec1.begin(),vec1.begin()+5); //第一个填自己的迭代器, 后两个填另外一个对象的迭代器 把那个前闭后开区间插到自己元素的前面 //移除元素 //移除某个位置的元素或者某个[)区间的元素, 返回下一个元素的位置 vec.erase(pos); vec.erase(beg,end); //assign //7个100 vec.assign(7,100); //如果vec里面有元素, 会清除掉里面的元素 vec.assign(vec.end(),8,6) //在vec的末尾插入8个6 //迭代器分配 vec.assign(it,it+5); //类似前面初始化的时候的从数组分配 int i[6] = {1,2,3,4,5,6}; vec.assign(i,i+4);
-
算法类 查找/排序
//全局find (sort很慢,先sort再binary research不一定快) find(); //全局sort (自己如果有sort,就用自己的sort) sort(); //vector无自己的sort. "vector.sort();"这个实现多此一举, 编译器也不让这么写