相关文章推荐
光明磊落的葡萄酒  ·  2023-2024年吉林大学先进材料与工程前 ...·  1 年前    · 
打篮球的匕首  ·  文广旅体相关行业税费政策汇编_通知公告_江门 ...·  2 年前    · 
爽快的佛珠  ·  美国漫威有镭射眼!日本火影有写轮眼!都不敌我 ...·  3 年前    · 
天涯  ·  微软开源 JARVIS(贾维斯):用 ...·  3 年前    · 
高大的香蕉  ·  卡卡西写轮眼_卡卡西写轮眼的能力_卡卡西写轮 ...·  3 年前    · 
Code  ›  C++打怪 之 vector开发者社区
c++ vector char函数 vector初始化
https://cloud.tencent.com/developer/article/1771819
干练的西红柿
2 年前
开源519

C++打怪 之 vector

前往小程序,Get 更优 阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
开源519
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > C++打怪 之 vector

C++打怪 之 vector

作者头像
开源519
发布 于 2021-01-12 14:42:23
1.2K 0
发布 于 2021-01-12 14:42:23
举报
文章被收录于专栏: 开源519 开源519

1. 简介

❝Vector类 是在 java 中可以实现自动增长的对象数组,vector在C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。---百度百科 ❞

2. 场景实例

在C语言编程中,涉及到声明一个全局数组的时候,经常会遇到一种情况,数组的大小设定多少合适。一般情况下我们会设定一个比较大的值,例如1000甚至更大,主要就是怕在代码运行中,用到该数组时,若数组容量不够,出现越界的情况,从而导致宕机等较为严重的问题。但是设置过大,也会导致内存浪费,虽然不是什么大问题,但这种变量若定义过多,也会导致一笔不小的开销。在C语言中,可以通过动态数组来解决这一问题。但是在一些场景中,用起来较为复杂。


通过实际例子说明问题,声明一个结构体中,其中包含一个数组成员。

代码语言: javascript
复制
/* 因为无法确定name长度,不得不设定一个不可超越的较大值 */
#define NAME_LENGTH_MAX 100
struct STUDENT {
    char years;
    long id;
    char name[NAME_LENGTH_MAX];

在此实例中,我们可以发现,结构体STUDENT包含不确定长度的name成员,为了避免代码访问name数组越界,不得不声明一个不可超越的长度。这就会造成资源浪费的情况。一般情况下,可采用下面两种方法优化。


「优化1:C语言中采用动态数组优化」

代码语言: javascript
复制
struct STUDENT {
    char years;
    long id;
    char *name;
struct STUDENT std;

在用到std变量时,必须对std的name成员分配空间,否则会出现野指针问题,在运行时导致机器宕机。可通过malloc等函数对name进行分配空间。使用起来较为复杂。


「优化2:C++ vector」

代码语言: javascript
复制
struct STUDENT {
    char years;
    long id;
    vector<char> name;

用到std变量时,同样需要对name初始化,可采用vector提供的接口push_back赋初值即可。较优化1方案,使用起来方便一些。


3. 基本用法

C++ 中的vector实现实用的接口供开发者选择:

代码语言: javascript
复制
//头文件
#include <vector> 
using namespace std;
/* 构造方法 */
vector<类型>标识符
vector<类型>标识符(最大容量)
vector<类型>标识符(最大容量,初始所有值)
vector(const vector&) 复制vector
vector(begin,end) 复制数组begin到end之间的值到vector
/* E.g.几种较为常用的方法 */
vector<int> num; //int num[]
vector<char> num(5); //char num[];
vector<char> num(5, 1); //char num[] = {1,1,1,1,1};
int num[5]={1,2,3,4,5};
vector<int>num_copy(i+2,i+4);  //int num_copy[] ={3, 4, 5};
vector< vector<int> >num; //二维向量. 这里最外的<>要有空格。否则在比较旧的编译器下无法通过 int [][];
/* 常用接口 摘自 https://www.runoob.com/w3cnote/cpp-vector-container-analysis.html*/
1.push_back 在数组的最后添加一个数据
2.pop_back 去掉数组的最后一个数据
3.at 得到编号位置的数据
4.begin 得到数组头的指针
5.end 得到数组的最后一个单元+1的指针
6.front 得到数组头的引用
7.back 得到数组的最后一个单元的引用
8.max_size 得到vector最大可以是多大
9.capacity 当前vector分配的大小
10.size 当前使用数据的大小
11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
12.reserve 改变当前vecotr所分配空间的大小
13.erase 删除指针指向的数据项
14.clear 清空当前的vector
15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)
16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)
17.empty 判断vector是否为空
18.swap 与另一个vector交换数据

4. 实例

代码语言: javascript
复制
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <string>
#include <vector>
using namespace std;
struct STUDENT {
    char years;
    long id;
    vector<int> name;
void show(vector<int> &vec)
    cout <<"Value: ";
    int num = 0;
    for (auto i = vec.begin(); i != vec.end(); i++) {
        cout << vec.at(num++) << " ";
    cout << endl;
int main()
    struct STUDENT stud;
    vector<int> tmp(3, 5) ; //int tmp[] = {5, 5, 5}; 
    tmp.push_back(23);
    cout <<"---- 1st: "; 
    show(tmp);
    tmp.insert(tmp.begin(), 2, 10);
    cout <<"---- 2nd: "; 
    show(tmp);
    tmp.pop_back();
    cout <<"---- 3rd: ";
    show(tmp); 
    cout <<"---- 4th: " << tmp.capacity()<<endl;
    tmp.clear();
    cout <<"---- 5th: ";
    show(tmp);
    return 0;
 
推荐文章
光明磊落的葡萄酒  ·  2023-2024年吉林大学先进材料与工程前沿国际青年学者论坛诚邀海内外英才-吉林大学材料科学与工程学院
1 年前
打篮球的匕首  ·  文广旅体相关行业税费政策汇编_通知公告_江门市文化广电旅游体育局
2 年前
爽快的佛珠  ·  美国漫威有镭射眼!日本火影有写轮眼!都不敌我们中国这位的瞳术_能力
3 年前
天涯  ·  微软开源 JARVIS(贾维斯):用 ChatGPT 控制 AI 模型 -
3 年前
高大的香蕉  ·  卡卡西写轮眼_卡卡西写轮眼的能力_卡卡西写轮眼谁给的 - 抖音
3 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号