vector容器、swap、reserve、resize

vector:动态数组

单口容器,从首位置或中间位置插入元素时,会使得后面的元素位置发生变化,所以一般建议用push_back来从后端追加添加元素。(下右图,deque是双口容易(双端队列))

      

容器的基本操作代码如下:(包含了巧用swap收缩空间及reserve预留空间)

  1 #define _CRT_SECURE_NO_WARNINGS
  2 #include <iostream>
  3 #include <cstdlib>
  4 #include <vector>  //动态数组
  5 #include <algorithm>  //算法
  6
  7 using namespace std;
  8
  9 void print_vector(vector<int> &v) {
 10     for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
 11         cout << *it << " ";
 12     }
 13     cout << endl;
 14 }
 15
 16 void test01() {
 17     vector<int> v1;//默认构造
 18     int arr[] = { 10,20,30,40 };
 19     vector<int> v2(arr, arr + sizeof(arr) / sizeof(int));
 20     vector<int> v3(v2.begin(), v2.end());
 21     vector<int> v4(v3);
 22
 23     print_vector(v2);
 24     print_vector(v3);
 25     print_vector(v4);
 26 }
 27
 28 void test02() {
 29     int arr[] = { 10,20,30,40 };
 30     vector<int> v1(arr, arr + sizeof(arr) / sizeof(int));
 31     vector<int> v2;
 32     v2.assign(v1.begin(), v1.end());
 33     vector<int> v3;
 34     v3 = v2;
 35
 36     int arr1[] = { 100,200,300,400 };
 37     vector<int> v4(arr1, arr1 + sizeof(arr1) / sizeof(int));
 38
 39     print_vector(v1);
 40     print_vector(v2);
 41     print_vector(v3);
 42     print_vector(v4);
 43
 44     cout << "-----------------" << endl;
 45
 46     v4.swap(v1);//指针交换,不是堆上的数据拷贝
 47     print_vector(v1);
 48     print_vector(v2);
 49     print_vector(v3);
 50     print_vector(v4);
 51
 52 }
 53
 54 void test03() {
 55     int arr[] = { 10,20,30,40 };
 56     vector<int> v1(arr, arr + sizeof(arr) / sizeof(int));
 57
 58     if (v1.empty()) {
 59         cout << "为空" << endl;
 60     }
 61     else {
 62         cout << "不为空" << endl;
 63     }
 64     print_vector(v1);
 65     v1.resize(2);//传进的参数小于容器的size,会从后往前删除相应数量元素
 66     print_vector(v1);
 67     v1.resize(6, 1);//传进的参数大于容器的size,会用传进的第二个参数补全
 68     print_vector(v1);
 69
 70     for (int i = 0; i < 10000; i++) {
 71         v1.push_back(i);
 72     }
 73
 74     cout << "size:" << v1.size() << endl;//元素个数
 75     cout << "容量:" << v1.capacity() << endl;//容量
 76
 77 }
 78
 79 void test04() {
 80     int arr[] = { 100,200,300,400 };
 81     vector<int> v1(arr, arr + sizeof(arr) / sizeof(int));
 82     for (int i = 0; i < v1.size(); i++) {
 83         cout << v1[i] << " ";
 84     }
 85     cout << endl;
 86
 87     for (int i = 0; i < v1.size(); i++) {
 88         cout << v1.at(i) << " ";
 89     }
 90     cout << endl;
 91     //at是抛异常的,[]不抛异常
 92
 93     v1.push_back(10);
 94     v1.push_back(20);
 95     v1.insert(v1.begin(), 30);
 96     v1.insert(v1.end(), 40);
 97     v1.insert(v1.begin() + 2, 110);//vector支持迭代器随机访问
 98     //一般情况下,支持数组下标,都支持随机访问
 99
100     print_vector(v1);
101
102     //删除
103     v1.erase(v1.begin());
104     print_vector(v1);
105     v1.erase(v1.begin() + 1, v1.end());
106     print_vector(v1);
107     v1.clear();
108
109     cout << "size:" << v1.size() << endl;
110
111
112 }
113
114 //巧用swap缩减空间
115 void test05(){
116     //vector添加元素时会自动增长空间,但是删除元素时不会自动缩小空间
117     vector<int> v;
118     for (int i = 0; i < 100000; i++) {
119         v.push_back(i);
120     }
121     cout << "size:" << v.size() << endl;
122     cout << "capacity:" << v.capacity() << endl;
123
124     v.resize(10);
125     cout << "-------------" << endl;
126     cout << "size:" << v.size() << endl;
127     cout << "capacity:" << v.capacity() << endl;
128
129     //收缩空间
130     //vector<int>(v)这是一个用v初始化的匿名对象
131     //与v交换完指针后使v的空间压缩,匿名对象自动销毁
132     vector<int>(v).swap(v);
133     cout << "-------------" << endl;
134     cout << "size:" << v.size() << endl;
135     cout << "capacity:" << v.capacity() << endl;
136 }
137
138 void test06() {
139     //reserve预留空间 与resize区别
140
141     int num = 0;
142     int* address = NULL;
143
144     vector<int> v;
145     v.reserve(100000);//预留空间
146     for (int i = 0; i < 100000; i++) {
147         v.push_back(i);
148         if (address != &(v[0])) {
149             address = &(v[0]);
150             num++;//可以判断扩展空间的次数
151         }
152     }
153
154     cout << "num:" << num << endl;
155     //如果知道容器大概需要的存储空间的元素个数,那么可以用reserve预留空间
156     //避免多次扩展空间减低效率
157 }
158
159 int main(void) {
160     test06();
161
162     system("pause");
163     return 0;
164 }

vector_code

reserve和risize:

原文地址:https://www.cnblogs.com/zzx1905/p/vector_swap_reserve_resize.html

时间: 2024-10-11 10:51:42

vector容器、swap、reserve、resize的相关文章

C++ STL vector容器学习

STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector,list, deque, set, map等),算法完成特定任务,迭代器用来遍历容器对象,扮演容器和算法之间的胶合剂. 模板类vector 在计算中,矢量(vector)对应数组,它的数据安排以及操作方式,与array非常类似.在C++中,使用vector模板类时,需要头文件包含#include<v

备忘: C++中的 vector 容器

在C++ 中使用 vector:容器或叫向量.对用来管理不定长度的数据集或经常变化的数据组,很方便.可以简单的理解他是一种数据组,一种数据类型的集合. vector是同一种类型的对象的集合.它相当于一个动态的数组, 当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. 使用vector首先要在程序开头处加上头文件,并使用其命名 : #include <vector> using std::vector; vector的声明与初始化: vector <类型

vector 容器迭代器(二)

vector容器迭代器(一)里面大牛对vector介绍的已经很详细了,下面结合自己的项目开发的问题谈谈使用 一.关于capacity和size[1] 在下想用数组引用的方式遍历vector中的元素,结果一直采用capacity,最后的结果就是总是出错,查了半天才知道原来这个capacity是只扩不收的,我因为 需要删除了vector(采用erase,第三部分)中的数,但是capacity没有更新,结果我按照capacity的指示寻找元素,明显就会越界 [1] ---->Size指目前容器中实际有

Vector 容器迭代器 (一)

C++里面vector好像越来越成为取代数组的利器,具体区别详参C++ primer plus.今天写程序用到了这个东西,试水之后发现很多问题,特别是因为capacity和size的问题困扰了一天,虽然问题很stupid,还是把关于vector的介绍整理如下,希望用到改工具的人少走弯路: 一:什么是容器[1](文章援引已注明,请尊重原创作者): vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能

标准模板库(STL)学习探究之vector容器

标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据.为了可以使用vector,必须在你的头文件中包含下面的代码:#include <vector>构造函数. Vectors 包含着一系列连续存储的元素,其行为和数组类

【C++】STL,vector容器操作

C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板.标准库vector类型使用需要的头文件:#include <vector>.vector 是一个类模板.不是一种数据类型,vector<int>是一种数据类型.Vector的存储空间是连续的,list不是连续存储的. 一. 定义和初始化vector< typeName > v1;       //默认v1为

Vector 容器

介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了.   Vector总览 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象

STL之二:vector容器用法详解

转载于:http://blog.csdn.net/longshengguoji/article/details/8507394 vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组.像数组一样,vector类也用从0开始的下标表示元素的位置:但和数组不同的是,当vector对象创建后,数组的元素个数会随着vector对象元素个数的增大和缩小而自动变化. vector类常用的函数如下所示: 1.构造函数 vector():创建一个空vector vector(int nSize)

向量vector 容器浅析

一.什么是vector? 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container).跟任意其它类型容器一样,它能够存放各种类型的对象.可以简单的认为,向量是一个能够存放任意类型的动态数组. 二.容器特性 1.顺序序列 顺序容器中的元素按照严格的线性顺序排序.可以通过元素在序列中的位置访问对应的元素. 2.动态数组 支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作.操供了在序列末尾相对快速地添加/删除元素的操作. 3.能够感知内存分配器的

C++学习(19)—— vector容器

1.vector基本概念 功能: vector数据结构和数组非常相似,也成为单端数组 vector与普通数组区别: 不同之处在于数组是静态空间,而vctor可以动态扩展 动态扩展: 并不是在原空间之后续借新空间,而是找更大的内存空间,然后将原数据拷贝到新空间,释放原空间 vector容器的迭代器是支持随机访问的迭代器 ? 2.vector构造函数 功能描述: 创建vector容器 函数原型: vector<T> v; //采用模板实现类实现,默认构造函数 vector(v.begin(), v