C++中的vector 用法解析
一、概述
vector 是C++标准模板库的部分内容,他是一个多功能的,能够操作多种 数据结构和算法 的模板类和函数库。
vector 是一个容器,它能够存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,可以动态改变大小。
//C语言风格
int myhouse[];
//采用vector
vector<int> vecmyhouse();
当如上定义后,vecmyhouse就可以存放100个int 型的数据了。
1 它可以像普通数组一样访问
vecmyhouse[] = ;
2 你可以顺序的向容器中填充数据
int i=;
for(;i<;i++)
{
vecmyhouse.push_back();
}
3 可以动态的改变它的大小,通过下面这条语句实现
将容器的大小改为400,这样容器中就可容纳400个int 型数据了
vecmyhouse.resize();
4 可以在容器中装入自定义的数据类型
//自定义一个class
class cmyclass
{
。。。。。
};
//定义一个存放class的容器
vector<cmyclass> vedmyhouse;
5 可以在定义容器时为他赋初值
//定义一个容纳100个int型数据的容器,初值赋为0
vector<int> vecmyhouse(,);
6 可以把一个容器的对象赋值给另外一个容器
//定义一个容纳100个int型数据的容器,初值赋为0
vector<int> vecmyhouse(,);
//定义一个新的容器,内容与上述容器一样
vector<int> myvec;
myvec = vecmyhouse;
二、 以上是vector容器的简单介绍,下面将详细介绍它的其他功能:
1 为了使用vector ,必须在你的头文件中包含下面的代码:
#include <vector>
2 vector属于std命名域的,因此需要通过命名限定,可以在文件开头加上
using std::vector;
or
using namespace std;
or
std::vector<int> myhouse; //直接加上前缀
3 vector的声明
vector<ElemType> c; 创建一个空的vector
vector<ElemType> c1(c2); 创建一个vector c1,并用c2去初始化c1
vector<ElemType> c(n) ; 创建一个含有n个ElemType类型数据的vector;
vector<ElemType> c(n,elem); 创建一个含有n个ElemType类型数据的vector,并全部初始化为elem;
c.~vector<ElemType>(); 销毁所有数据,释放资源;
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)的数据,无返回值
三、下面描述一下什么是迭代器
迭代器相当于指针
//对于变量而言,使用指针指向对应的变量
//以后就可以使用 * 加指针来操作变量了
int a = ;
int *p;
p = &a;
使用指针操作该变量,例如:*p = 11; // 操作后a变为 11
对于容器,使用迭代器操作容器中对应位置的值
当迭代器指向了容器中的某位置,则可以使用 * 加迭代器操作该位置了
//定义一个vector
std::vector<int> myvec;
//添加10个元素
for(int j=; j<; j++)
{
myvec.push_back(j);
}
// 定义一个迭代器
std::vector<int>::iterator p;
// 指向容器的首个元素
p = myVec.begin();
// 移动到下一个元素
p ++;
// 修改该元素赋值
*p = ; //< 则myVec容器中的第二个值被修改为了20
// 循环扫描迭代器,改变所有的值
p = myVec.begin();
for( ; p!= myVec.end(); p++ )
{
*p = ;
}
四 实例
/*---------------------------------------------
http://www.cnblogs.com/ziyi--caolu/archive/2013/07/04/3170928.html
http://blog.csdn.net/twphoenix/article/details/50628468#
----------------------------------------------*/ #include <iostream>
#include <vector>
#include <stdlib.h>
#include <algorithm> using namespace std; /*-----------------------------------------
【1】 数据的输入和删除。push_back 和pop_back
依次在末尾加入输入的数字,然后将最后一个元素删除(success)
-----------------------------------------*/
/*
void main()
{
int i=0;
vector<int> v;
for (i = 0; i < 10; i++)
{
cin >> i;
v.push_back(i); //将元素添加到数组最后
}
for (i = 0; i < v.size(); i++) //v.size() 表示vector存入元素的个数
{
cout << "结果 \n"<<v[i] << endl;
//system("pause"); }
printf("\n");
v.pop_back(); //将数组最后一个元素删除 for (i = 0; i < v.size(); i++)
{
cout << v[i] << endl;
} printf("\n"); system("pause"); //madan,千万不要写成puse }
*/ /*---------------------------------------------------
【2】元素的访问(调试不成功)
-----------------------------------------------------*/
/*
void main()
{
int i, n;
vector<int> v;
vector<int>::iterator it; //声明一个vector的迭代器 for (i = 0; i < 10; i++)
{
cin >> n;
v.push_back(n);
} //(1) 通过操作[]访问
for (i = 0; i < v.size(); i++)
{
cout << v[i] << endl;
}
cout<<"\n"; //(2)通过 at(index) 访问
for (i = 0; i < v.size(); i++)
{
cout << v.at(i);
}
printf("\n"); //(3)通过迭代器iterator访问
for (it = v.begin(); it != v.end(); it++)
{
cout<< *it<<endl;
}
printf("\n"); system("pause"); }
*/ /*----------------------------------------------
【3】排序和查询 (升序和降序那里有点问题)
------------------------------------------------*/
/*
void main()
{
int i, n;
vector<int> v;
vector<int>::iterator it; //声明一个vector的迭代器 for (i = 0; i < 10; i++)
{
cin >> n;
v.push_back(n);
}
it = find(v.begin(),v.end(),3); //进行查找元素3
if (it == v.end()) //如果没有该元素,则返回指向容器最后一个单元+1的指针
{
printf("该元素不存在与容器中 \n");
}
else
{
printf("%d \n",it - v.begin());
} sort(v.begin(),v.end()); //升序进行排序
for (i = 0; i <10; i++)
{
cout << v[i]<<" ";
} reverse(v.begin(),v.end()); //降序进行排序
for (i = 0; i <10; i++)
{
cout << v[i] << " ";
} system("pause"); }
*/ /*---------------------------------------------------
【4】 二维容器(没太明白)
-----------------------------------------------------*/
void main()
{
int i, j;
int m;
vector< vector<int> > v; //定义二维容器的时候,最外面俩个<> 处一定要有空格,否则会报错
vector<int> v1;
for (i = ; i < ; i++) //使用二维容器之前对其进行初始化,否则会报错
{
v.push_back(v1);
}
for (i = ; i < ; i++)
{
for (j = ; j < ; j++)
{
cin >> m;
v[i].push_back(m);
}
}
printf("%d \n",v.size()); //返回当前容器中的元素个数(不应该是16或更多么??????但实际是 4???) for (i = ; i < v.size(); i++)
{
for (j = ; j < v[i].size(); j++)
{
printf("%d ",v[i][j]);
}
printf("\n");
}
system("pause"); }
...................未完待续
C++中的vector 用法解析的更多相关文章
- MATLAB中冒号的用法解析
MATLAB中冒号的用法解析 1.: 表示所有的意思. (1)如:a(1,:) 表示a的第1行,示例: 结果: 同样的如果a(2,:)表示a的第2行 (2)反过来,a(:,2) 表示a的第3列,示例: ...
- sql server中replace()函数用法解析
知识点一:replace()的语法 REPLACE ( string_replace1 , string_replace2 , string_replace3 ) 参数解析: string_repla ...
- 熟练掌握js中this的用法,解析this在不同应用场景的作用
由于其运行期绑定的特性,JavaScript 中的 this 含义要丰富得多,它可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式. JavaScript 中函数的调用有以下几种方式:作 ...
- Oracle中的rownum用法解析
注意:rownum从1开始: 1.rownum按照记录插入时的顺序给记录排序,所以有order by的子句时一定要注意啊! 2.使用时rownum,order by字段是否为主键有什么影响? 3 ...
- C/C++中容器vector用法
C++中数组非常坑,有没有相似Python中list的数据类型呢?相似的就是vector!vector 是同一种类型的对象的集合,每一个对象都有一个对应的整数索引值. 和 string 对象一样.标准 ...
- 内联函数 —— C 中关键字 inline 用法解析
一.什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗. 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数. 栈空间就是指放 ...
- 【转载】内联函数 —— C 中关键字 inline 用法解析
转载地址:https://blog.csdn.net/zqixiao_09/article/details/50877383 一.什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈, ...
- ObjectiveC中的block用法解析
Block Apple 在C, Objective-C,C++加上Block这个延申用法.目前只有Mac 10.6 和iOS 4有支持.Block是由一堆可执行的程序组成,也可以称做没有名字的Func ...
- Java中static的用法解析
知识点1.static关键字a.可以修饰变量,方法,代码块b.修饰的变量和方法可以使用类名.变量名/类名.方法名调用c.static修饰的资源为静态资源,在类加载的时候执行d.在静态方法中只能调用静态 ...
随机推荐
- 分享一些自己的学习过程和学习方法(来自daimajia)
每天,都会有人在微博上私信我,问我关于学习和成长的问题.这种问题我一般都不会回复某个j,毕竟每个人的情况不一样,每个人对待事物的性格也不一样,我不能夸下海口的说,你看某本书几个月就能如何如何,我能做的 ...
- mybatis generator maven插件自动生成代码
如果你正为无聊Dao代码的编写感到苦恼,如果你正为怕一个单词拼错导致Dao操作失败而感到苦恼,那么就可以考虑一些Mybatis generator这个差价,它会帮我们自动生成代码,类似于Hiberna ...
- jQuery 树形菜单
树形菜单 在 jQuery easyu中其左侧的主菜单使用的是 easyui 中的 tree 组件,不是太熟悉,不过感觉不是太好用. 比如 easyui 中的 tree 需要单击分叉节点前的小三角,才 ...
- BZOJ 2006: [NOI2010]超级钢琴
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2613 Solved: 1297[Submit][Statu ...
- TypeScript 素描-基础类型
博文读自 TypeScript 官方文档而来,不具有学习性,仅是本人学习时记录以供日后翻阅 ,有学习TypeScript的朋友还请去看更为详细的官方文档 TypeScript官网文档中的基础类型, T ...
- C#设计模式
自从上次记录完“重构之道”以后,查询设计模式挺麻烦的.就打算把原先写的设计模式系列合并一下. 设计原则 使用设计模式的根本原因就是适应需求变化,提高代码的复用率,使程序更具有扩展性和可维护性. SOL ...
- 他(he)(钟神)
他[问题描述]一张长度为N的纸带,我们可以从左至右编号为0 −N(纸带最左端标号为0) .现在有M次操作,每次将纸带沿着某个位置进行折叠,问所有操作之后纸带的长度是多少.[输入格式]第一行两个数字N, ...
- 基于Vue2.0+Vue-router构建一个简单的单页应用
爱编程爱分享,原创文章,转载请注明出处,谢谢!http://www.cnblogs.com/fozero/p/6185492.html 一.介绍 vue.js 是 目前 最火的前端框架,vue.js ...
- 【JavaWeb】SSM+SpringSecurity+EhCache+JCaptcha 完整Web基础框架(六)
Showings 我个人的项目,当前不断地在更新. 我希望做成一个好项目,同时,也是在锻炼自己的技术. 在项目中发现问题,学习知识,是比较可取的一条路子. 这样学习到的知识,虽然分散,但是都很实用,而 ...
- nginx_mysql_redis配置
#Nginx所用用户和组,window下不指定 #user nobody; #工作的子进程数量(通常等于CPU数量或者2倍于CPU) worker_processes 2; #错误日志存放路径 #er ...