vector申请空间(vector容器(c++STL三))

动态数组,可变数组。

vector容器是一个单口容器。

申请空间

vector实现动态增长的基本原理:当插入新元素的时候,如果空间不足,那么vector会重新申请更大的一块内存空间,将原空间数据拷贝到新空间,释放旧空间的数据,再把新元素插入新申请的空间,默认为两倍增长。

vector是单口容器,所以在尾端插入和删除元素效率较高, 在指定位置插入,势必会引起数据元素移动, 效率较低.

vector常用操作

#include<iostream> #include<vector> void printV(std::vector<int>& v) { for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++) { std::cout << *it << " "; } std::cout << std::endl; } //初始化操作 void test() { std::vector<int> v1; //默认构造 int arr[] = {10, 20, 30, 40, 50}; std::vector<int> v2(arr, arr + sizeof(arr)/sizeof(int)); std::vector<int> v3(v2.begin(), v2.end()); std::vector<int> v4(v3); print(v2); print(v3); print(v4); } //赋值操作 void test2() { int arr[] = {10, 20, 30, 40}; std::vector<int> v1(arr, arr+sizeof(arr)/sizeof(int));//默认构造 std::vector<int> v2; v2.assign(v1.begin(), v1.end()); //成员方法 std::vector<int> v3; v3 = v2;// 重载 int arr1[] = {100, 200, 300, 400}; std::vector<int> v4(arr1, arr1+sizeof(arr)/sizeof(int)); print(v1); print(v2); print(v3); print(v4); std::cout << "-------------------" << std::endl; v4.swap(v1); print(v1); print(v2); print(v3); print(v4) } //大小操作 void test3() { int arr1[] = {100, 200, 300, 400}; std::vector<int> v4(arr1, arr1 + sizeof(arr1)/sizeof(int));//默认构造 std::cout << "size: " << v4.size() << std::endl; if (v4.empty()) { std::cout << "空" << std::endl; } else { std::cout << "不空" << std::endl; } printV(v4); v4.resize(2); printV(v4); v4.resize(6, 1); printV(v4); for (int i = 0 i < 10000; i++) { v4.push_back(i); } std::cout << "size: " << v4.size() << std::endl; //元素的个数 std::cout << "容量: " << v4.capacity() << std::endl; //容量 } //存取数据 void test4() { int arr1[] = {100, 200, 300, 400}; std::vector<int> v4(arr1, arr1 + sizeof(arr1)/sizeof(int));//默认构造 for (int i = 0; i < v4.size(); i++) { std::cout << v4[i] << " "; } std::cout << std::endl; for (int i = 0; i < v4.size(); i++) { std::cout << v4.at(i) << " "; } std::cout << std::endl; //区别: at抛异常, []不抛异常 std::cout << "front: " << v4.front() << std::endl; std::cout << "back: " << v4.back() << std::endl; } //插入和删除 void test5() { std::vector<int> v; v.push_back(10); v.push_back(20); //头插法 v.insert(v.begin(), 30); v.insert(v.end(), 40); v.insert(v.begin() + 2, 100);//vector支持随机访问 printV(v); //支持数组下标的,一般都支持随机访问 //迭代器可以直接+2, +3, -2, -5这些操作 //删除 v.erase(v.begin()); printV(v); v.erase(v.begin() + 1, v.end()); printV(v); v.clear(); std::cout << "size: " << v.size() << std::endl; } //巧用swap缩减空间 void test6() { //vector添加元素 它会自动增长,删除元素的时候不会自动减少 std::vector<int> v; for (int i = 0; i < 100000; i++) { v.push_back() } std::cout << "size: " << v.size() << std::endl; std::cout << "capacity: " << v.capacity() << std::endl; v.resize(10); std::cout << "--------------------------" << std::endl; std::cout << "size: " << v.size() << std::endl; std::cout << "capacity: " << v.capacity() << std::endl; //收缩空间 std::vector<int>(v).swap(v); std::cout << "--------------------------" << std::endl; std::cout << "size: " << v.size() << std::endl; std::cout << "capacity: " << v.capacity() << std::endl; } //reserve和resize区别 void test7() { //reserve是容器预留空间,但在空间不真正创建元素对象,所以在没有新的对象之前,不能引用容器内的元素 //resize是改变容器的大小,且在创建对象,因此,调用这个函数之后,就可以引用容器内的对象了 int num = 0; int* address = NULL; std::vector<int> v; v.reserve(100000); for (int i = 0; i < 100000; i++) { v.push_back(i); if (address != &(v[0])) { address = &(v[0]); num++; } } std::cout << "num: " << num << std::endl; } int main(void) { //test(); //test2(); //test3(); //test4(); //test5(); //test6(); test7(); return 0; }

申明:本文章记录学习笔记,分享给大家一起学习,有不正确的地方欢迎大家指出。如有侵权,马上删除。

您可以还会对下面的文章感兴趣

最新评论

  1. 芦苇风
    芦苇风
    发布于:2022-04-27 19:31:02 回复TA
    00; i++) { v.push_back() } std::cout << "size: " << v.size() << std::endl; std
  1. 风吹尘飞
    风吹尘飞
    发布于:2022-04-27 18:11:09 回复TA
    cout << "num: " << num << std::endl;}int main(void){ //test(); //test2(); //test3(); //test4(); //test5();
  1. 闻人保玛义
    闻人保玛义
    发布于:2022-04-27 07:59:19 回复TA
    属于青春的写照,上头记载着多少关于我们同样的故事。

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

使用微信扫描二维码后

点击右上角发送给好友