C++中的vector 用法解析

一、概述

vector 是C++标准模板库的部分内容,他是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。

vector 是一个容器,它能够存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,可以动态改变大小。

1 //C语言风格
2 int myhouse[100];
3 //采用vector
4 vector<int>  vecmyhouse(100);

当如上定义后,vecmyhouse就可以存放100个int 型的数据了。

1 它可以像普通数组一样访问

1 vecmyhouse[50] = 1024;

2 你可以顺序的向容器中填充数据

1 int i=0;
2 for(;i<25;i++)
3 {
4     vecmyhouse.push_back(1);
5 }

3 可以动态的改变它的大小,通过下面这条语句实现

将容器的大小改为400,这样容器中就可容纳400个int 型数据了

1 vecmyhouse.resize(400);

4 可以在容器中装入自定义的数据类型

1 //自定义一个class
2 class cmyclass
3 {
4    。。。。。
5 };
6 //定义一个存放class的容器
7 vector<cmyclass>   vedmyhouse;

5 可以在定义容器时为他赋初值

1 //定义一个容纳100个int型数据的容器,初值赋为0
2 vector<int>   vecmyhouse(100,0);

6 可以把一个容器的对象赋值给另外一个容器

1 //定义一个容纳100个int型数据的容器,初值赋为0
2 vector<int> vecmyhouse(100,0);
3 //定义一个新的容器,内容与上述容器一样
4 vector<int>  myvec;
5 myvec = vecmyhouse;

二、 以上是vector容器的简单介绍,下面将详细介绍它的其他功能:

1 为了使用vector ,必须在你的头文件中包含下面的代码:

1 #include <vector>

2 vector属于std命名域的,因此需要通过命名限定,可以在文件开头加上

1 using std::vector;       or  using namespace std;      or  std::vector<int> myhouse;    //直接加上前缀

3 vector的声明

vector c; 创建一个空的vector

vector c1(c2); 创建一个vector c1,并用c2去初始化c1

vector c(n) ; 创建一个含有n个ElemType类型数据的vector;

vector c(n,elem); 创建一个含有n个ElemType类型数据的vector,并全部初始化为elem;

c.~vector(); 销毁所有数据,释放资源;

4 vector 容器中常用的函数(c为一个容器对象)

c.push_back(elem); 在容器的最后位置添加一个元素elem

c.pop_back(); 删除容器最后位置处的元素

c.at(index); 返回指定index位置处的元素

c.begin(); 返回指向容器最开始位置数据的指针

c.end(); 返回指向容器最后第一个数据单元的指针+1

c.front(); 返回容器最开始单元数据的引用

c.back(); 返回容器最后一个数据的引用

c.max_size(); 返回容器的最大容量

c.size(); 返回当前容器中实际存放元素的个数

c.capacity(); 同c.size()

c.resize(); 重新设置vector的容量

c.reserve(); 同c.resize();

c.erase(p); 删除指针p指向位置的数据,返回指向下一个数据位置的指针(迭代器)

c.erase(begin,end); 删除begin,end区间的数据,返回指向下一个数据位置的指针(迭代器)

c.clear(); 清除所有数据

c.rbegin(); 将vector反转后的开始指针返回(其实就是原来end-1)

c.rend(); 将vector反转后的结束指针返回(其实就是原来的begin-1)

c.empty(); 判断容器是否为空,若为空返回true,否则返回false

c1.swap(c2); 交换俩个容器中的数据

c.insert(p,elem); 在指针p指向的位置插入数据elem,返回指向elem位置的指针

c.insert(p,n,elem); 在位置p插入n个elem数据,无返回值

c.insert(p,begin,end) 在位置p插入在区间[begin,end)的数据,无返回值

三、下面描述一下什么是迭代器

迭代器相当于指针

1 //对于变量而言,使用指针指向对应的变量
2 //以后就可以使用 * 加指针来操作变量了
3 int a = 10;
4 int *p;
5 p = &a;

使用指针操作该变量,例如:*p = 11; // 操作后a变为 11

对于容器,使用迭代器操作容器中对应位置的值

当迭代器指向了容器中的某位置,则可以使用 * 加迭代器操作该位置了

1 //定义一个vector
2 std::vector<int>  myvec;
3 //添加10个元素
4 for(int  j=0; j<10; j++)
5 {
6    myvec.push_back(j);
7 }
1 // 定义一个迭代器  
 2 std::vector<int>::iterator p;  
 3 // 指向容器的首个元素  
 4 p = myVec.begin();  
 5 // 移动到下一个元素  
 6 p ++;  
 7 // 修改该元素赋值  
 8 *p = 20 ; //< 则myVec容器中的第二个值被修改为了20  
 9 // 循环扫描迭代器,改变所有的值  
10 p = myVec.begin();  
11 for( ; p!= myVec.end(); p++ )  
12 {  
13 *p = 50;  
14 }

四 实例

1 /*---------------------------------------------
  2    http://www.cnblogs.com/ziyi--caolu/archive/2013/07/04/3170928.html
  3    http://blog.csdn.net/twphoenix/article/details/50628468#
  4 ----------------------------------------------*/
  5 
  6 #include <iostream>
  7 #include <vector>
  8 #include <stdlib.h>
  9 #include <algorithm>
 10 
 11 
 12 using namespace std;
 13 
 14 /*-----------------------------------------
 15  【1】 数据的输入和删除。push_back 和pop_back
 16   依次在末尾加入输入的数字,然后将最后一个元素删除(success)
 17 -----------------------------------------*/
 18 /*
 19 void main()
 20 {
 21     int i=0;
 22     vector<int> v;
 23     for (i = 0; i < 10; i++)
 24     {
 25         cin >> i;
 26         v.push_back(i);     //将元素添加到数组最后
 27     }
 28     for (i = 0; i < v.size(); i++)   //v.size() 表示vector存入元素的个数  
 29     {
 30         cout << "结果  \n"<<v[i] << endl;
 31         //system("pause");
 32         
 33     }
 34     printf("\n");
 35     v.pop_back();          //将数组最后一个元素删除
 36     
 37     for (i = 0; i < v.size(); i++)
 38     {
 39         cout << v[i] << endl;
 40     }
 41     
 42     printf("\n");
 43     
 44     system("pause"); //madan,千万不要写成puse
 45     
 46 }
 47 */
 48 
 49 
 50 /*---------------------------------------------------
 51   【2】元素的访问(调试不成功)
 52 -----------------------------------------------------*/
 53 /*
 54 void main()
 55 {
 56     int i, n;
 57     vector<int> v;
 58     vector<int>::iterator it;     //声明一个vector的迭代器
 59 
 60     for (i = 0; i < 10; i++)
 61     {
 62         cin >> n;
 63         v.push_back(n);
 64     }
 65     
 66     //(1) 通过操作[]访问
 67     for (i = 0; i < v.size(); i++)
 68     {
 69         cout << v[i] << endl;    
 70     }
 71     cout<<"\n";
 72     
 73     //(2)通过 at(index) 访问
 74     for (i = 0; i < v.size(); i++)
 75     {
 76         cout << v.at(i);       
 77     }
 78     printf("\n");
 79     
 80     //(3)通过迭代器iterator访问
 81     for (it = v.begin(); it != v.end(); it++)
 82     {
 83         cout<< *it<<endl;
 84     }
 85     printf("\n");
 86     
 87     system("pause");
 88 
 89 }
 90 */
 91 
 92 /*----------------------------------------------
 93  【3】排序和查询 (升序和降序那里有点问题)
 94 ------------------------------------------------*/
 95 /*
 96 void main()
 97 {
 98     int i, n;
 99     vector<int> v;
100     vector<int>::iterator it;    //声明一个vector的迭代器
101 
102     for (i = 0; i < 10; i++)
103     {
104         cin >> n;
105         v.push_back(n);
106     }
107     it = find(v.begin(),v.end(),3);     //进行查找元素3
108     if (it == v.end())                   //如果没有该元素,则返回指向容器最后一个单元+1的指针
109     {
110         printf("该元素不存在与容器中 \n");
111     }
112     else
113     {
114         printf("%d \n",it - v.begin());
115     }
116     
117     sort(v.begin(),v.end());     //升序进行排序
118     for (i = 0; i <10; i++)
119     {
120         cout << v[i]<<" ";
121     }
122     
123     reverse(v.begin(),v.end());   //降序进行排序
124     for (i = 0; i <10; i++)
125     {
126         cout << v[i] << " ";
127     }
128     
129     system("pause");
130     
131 }
132 */
133 
134 /*---------------------------------------------------
135  【4】 二维容器(没太明白)
136 -----------------------------------------------------*/
137 void main()
138 {
139     int i, j;
140     int m;
141     vector< vector<int> >   v;   //定义二维容器的时候,最外面俩个<> 处一定要有空格,否则会报错
142     vector<int> v1;
143     for (i = 0; i < 4; i++)  //使用二维容器之前对其进行初始化,否则会报错
144     {
145         v.push_back(v1);
146     }
147     for (i = 0; i < 4; i++)
148     {
149         for (j = 0; j < 4; j++)
150         {
151             cin >> m;
152             v[i].push_back(m);
153         }
154     }
155     printf("%d \n",v.size());    //返回当前容器中的元素个数(不应该是16或更多么??????但实际是 4???)
156     
157     for (i = 0; i < v.size(); i++)
158     {
159         for (j = 0; j < v[i].size(); j++)
160         {
161             printf("%d ",v[i][j]);
162         }
163         printf("\n");
164     }
165     system("pause");
166 
167 }

...................未完待续

原文链接: https://www.cnblogs.com/wyuzl/p/6227536.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/246533

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 上午1:36
下一篇 2023年2月14日 上午1:36

相关推荐