C++中STL的string vector使用笔记

2023-11-20

容器

STL中的容器包括顺序式容器和关联式容器
顺序式容器:记录元素的位置由记录的时间和地点决定
vector
list
deque
queue
priority_queue:
stack
关联式容器:由容器的规则决定
set
multiset
map
multimap

STL使用的基本方式

vector:动态数组
下面以vector来举例使用STL基本方式:
迭代器相当于指针

//定义一个容器,并且指定这个容器存放的类型是int
vector<int>v
//从末尾快速插入元素
v.push_back(1);
v.push_back(2);
v.push_back(3);
//容器提供的迭代器
vector<int>::iterator pBegin = v.begin();	//返回第一个元素的迭代器
vector<int>::iterator pEnd = v.end();	//返回最后一个元素的下一个位置
//用STL定义的算法遍历+自己写的打印函数(回调)
//因为我们是写代码的人,知道我们的要打印的数据是什么类型的
//所以由我们来回调打印
void PrintVector(int v){
	cout<<v;
	}
for_each(pBegin,pEnd,PrintVector);

常用容器的基本概念和使用

string容器的特性

char*与string的比较:

  1. char *是一个指针,string是一个类。string封装了char *管理这个字符串,是一个char *型的容器
  2. string封装了很多实用的成员方法。查找find,拷贝copy,删除delete,替换replace,插入insert。
  3. 不用考虑内存释放和越界。string管理char*所分配的内存,每一次string的复制、取值都由string类维护,不用担心复制越界和取值越界。

string初始化-拼接-赋值-查找

初始化:
#include<bits/stdc++.h>
using namespace std;
void test(){
	string s1;	//调用无参结构
	string s2(10,'a');	//有参构造
	string s3("abcdefg");	//C风格初始化
	string s4(s3);	//拷贝构造
}
赋值操作:
void test(){
	string s1;
	string s2("app");	//初始化
	cout<<s1<<endl;
	s1=s2;
	cout<<s1<<endl;
	s1='a';
	cout<<s1<<endl;
	//成员方法assign赋值
	s1.assign("jkl");
	cout<<s1<<endl;
	}
取值操作:

[]越界直接挂,at越界抛异常out_of_range

void test(){
	string s1="abcdefg";
	//重载[]操作符
	for(int i=0;i<s1.size();i++)
		cout<<s[i]<<" ";
	//成员函数at
	for(int i=0;i<s1.size();i++)
		cout<<s1.at(i)<<" ";
	//用catch(...)接异常
	catch(...){
	cout<<"越界"<<endl;
	}
}
拼接操作:
void test(){
	string s1="abcd";
	string s2="1111";
	s1+="abcd";	//能够+=一个C风格的字符串
	s1+=s2;	//能够+=一个string类型的字符串
	s1+='a';	//能够+=一个字符
	cout<<s1<<endl;

运行结果:

abcd111a
	//string.append(const string &s)->把字符串s的前n个字符连接到当前字符串结尾
	//string.append(const string &s,int pos, int n)->把字符串s中从pos开始的第n个字符串连接到当前字符串结尾
	//string.append(int n,char c)->在当前字符串的末尾加n个字符c
	string s3="2222";
	s2.append(s3)	//将s3加到s2的末尾
	string s4=s2+s3	//同上,s3添加在s2尾部
	cout<<s4<<endl;

运行结果:

111122222222
查找:
find()从前往后找,找str第一次出现的位置
rfind()从后往前找,找str最后出现的位置
void test(){
	string s="abcdefghjkl";
	int pos = s.find("fg");
	cout<<"pos:"<<pos<<endl;
}

返回第一次出现的位置,要查找最后一次位置同理。
运行结果

5

string替换-比较-字串-插入和删除

替换:
void test(){
	string s="abcdefg";
	s.replace(0,2,"111");
	cout<<s<<endl;
	}

将0~2位置替换成111。
运行效果:

111cdefg
比较:
void test(){
	string s1="abcd";
	string s2="abce";
	if(s1.compare(s2)==0){
	cout<<"相等"<<endl;
	}
	else cout<<"不相等"<<endl;
}

相等的时候返回零
运行效果:

不相等
截取子串:
void test(){
	string s="abcdefg";
	string mystr=s.substr(1,3);	//截取下标1~3的子串
	cout<<mystr<<endl;
}

运行效果

bcd
插入删除:
void test(){
	string s="abcdefg";
	s.insert(3,"111");	//下标3位置前面插入111
	cout<<s<<endl;
	
	s.erase(0,2);	//删除0~2的字符串
	cout<<s<<endl;	
}

运行结果:

abc111defg
c111defg

vector容器特性

push_back()-->从一个数组的尾部添加元素
pop_back()-->从一个数组的尾部删除元素

vector的迭代器:
v.begin()	//指向第一个元素
v.end()	//指向最后一个元素的下一个位置

vector的反向迭代器:
v.rbegin()	//指向第一个元素的前一个位置
v.rend()	//指向最后一个元素

虽然有insert()方法插入,但是要将insert()之后的元素向后移,,,,十分的麻烦~~ 因此我们一般选择只在尾部操作

vector构造函数

初始化:
vector<T>v;		//采用模板实现类实现,默认初始化为空
vector(v.begin(),v.end());	//将v[begin(),end())区间中的元素拷贝给本身。
vector(n,elem)	//将n个elem拷贝给本身

int arr[] = {2,3,4,1,9};
vector<int>v1(arr,arr+sizeof(arr)/sizeof(int)); //用数组初始化
打印
//可以自己写一个算法打印,使用迭代器(相当于指针)
/*定义一个迭代器变量指向 v.begin :
vector<int>::iterator p=v4.begin()
*/
for(vector<int>::iterator p=v.begin();p!=v.end();p++)
	cout<<*p<<" ";
cout<<endl;
赋值
void test(){
	int arr[] = {2,3,4,1,9};
	vector<int>v1(arr,arr+sizeof(arr)/sizeof(int));
	vector<int> v2;
	v2=v1;	//用赋值号操作
	vector<int> v3;	
	v3.assign(v1.begin(),v1.end());		//用成员符号操作
}
交换
void test(){
	int arr[] = {2,3,4,1,9};
	vector<int>v1(arr,arr+sizeof(arr)/sizeof(int));
	int brr[] = {200,300,400,100,900};
	vector<int>v2(brr,brr()sizeof()/sizeof(int));
	v2.swap(v1)
}
大小操作
size();	//返回容器中元素的个数
empty();	//判断容器是否为空
resize(int num);	//重新指定容器的长度为num,若容器变长则默认值填充;若容器变短则末尾超出被剔除。
	void test(){
	int arr[] = {2,3,4,1,9};
	vector<int>v1(arr,arr+sizeof(arr)/sizeof(int));
	cout<<"size:"<<v1.size()<<endl;
	if(v1.empty())
		cout<<"空"<<endl;
	else
		cout<<"不空"<<endl;
}

运行结果:

5
不空

输入输出与string基本同
都有at和[ ]


插入和删除操作
insert(const pos, int count, ele);	//迭代器向指定位置pos插入count个ele
push_back()	//尾插
pop_back()		//尾删
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++中STL的string vector使用笔记 的相关文章

随机推荐

  • BLIP论文笔记

    BLIP Bootstrapping Language Image Pre training for Unified Vision Language Understanding and Generation Abstract 1 Intro
  • 在封装或使用el-dialog的时候无法获取到 $refs的坑

    经常使用 vue 的对element ui都不陌生 他的el dialog弹框组件为了性能的提升 第一次打开之前是不会渲染body内容的 这样子将会导致一个问题 我们无法获取到 dom 解决方法 方法一 因为源码是通过rendered 参数
  • 2021全国电设(F题)openmv的图像识别之数字识别

    基于openmv的图像识别 通过参加全国电子设计大赛F题总结出openmv4的数字识别 其它版本暂时没试过 欢迎交流 openmv简介 OpenMV是一个开源 低成本 功能强大的机器视觉模块 以STM32F427CPU为核心 集成了OV77
  • py214-基于Python+django的网购平台购物商城

    开发语言 Python python框架 django 软件版本 python3 7 python3 8 数据库 mysql 5 7或更高版本 数据库工具 Navicat11 开发软件 PyCharm vs code 前端框架 vue js
  • C++ 代码实现定义法计算行列式的值

    一 前言 最近在捣鼓C 学到线代的行列式之后就想着来捣鼓一下求行列式的值 主要原因是当时群里有人在捣鼓着用上下三角来求值 所以我最后就去玩定义法求值了 二 n阶行列式的定义 从定义中我们可以看出值计算公式由三个部分组成 分别是逆序数r 行列
  • C++基础知识 - 赋值构造函数

    赋值构造函数 如果没有定义赋值构造函数 编译器会自动定义 合成的赋值构造函数 与其他合成的构造函数 是 浅拷贝 又称为 位拷贝 定义 Human operator const Human other 实现 Human Human opera
  • MySQL数据库提示:Communications link failure,The last packet succe

    Last modified 2013 10 08 14 16 47 web网站使用MySQL数据库 今天突然报以下错误 Communications link failure The last packet successfully rec
  • html+css小名片代码

    作者 小刚 一位苦于信息安全的萌新小白帽 记得关注给个赞 谢谢 本实验仅用于信息防御教学 切勿用于其它用途 HTML css小名片效果 效果图 小名片代码 学习html css时做的小名片案例 效果图 鼠标移动到名片前 鼠标移动到名片后 小
  • STM32 电机教程 0 - MotorControl Workbench下载与安装

    前言 STM32微控制器提供了行业标准Arm Cortex M核心运行矢量控制或FOC模式的性能 广泛应用于空调 家用电器 无人机 建筑和工业自动化 医疗和电动自行车应用的高性能驱动器 STM32 MCSDK 电机控制软件开发工具包 固件
  • 扩散模型:Diffusion models as plug-and-play priors作为即插即用先验的扩散模型

    扩散模型 Diffusion models as plug and play priors作为即插即用先验的扩散模型 0 摘要 1 概述 2 方法 2 1 问题设置 2 2 将去噪扩散概率模型作为先验 3 实验 图像生成 3 1 MNIST
  • 搜狐畅游2018年9月15日校招真题(1)

    通过该道题目 题目描述如下 示例代码 include
  • mysql jdbc allow_mysql的jdbc.url携带allowMultiQueries=true参数的作用及其原理

    如下配置 jdbc url jdbc mysql 127 0 0 1 3306 chubb 2 autoReconnect true useUnicode true characterEncoding UTF 8 allowMultiQue
  • VMware 7.0

    在 vSphere 7 0 中 可以利用 vSphere Client HTML5 中提供的功能 基于 Flash 的 vSphere Web Client 已弃用且不再提供 VMware Host Client 是一个基于 Web 的应用
  • 纪录一下力扣28题越界的问题

    TOC 记录一下力扣28题用严蔚敏教材中的kmp求解出现的问题 ERROR42 不用怀疑数组越界了 贴上源码我们来分析一下 class Solution public void getNext vector
  • Canvas和SVG区别

    Canvas主要用笔刷来绘制2D图形 SVG主要用标签来绘制不规则矢量图 相同点 都是主要用来绘制2D图形 不同点 Canvas主要绘制位图 SVG主要绘制矢量图 不同点 SVG节点过多时渲染慢 Canvas性能更好一些 但写起来更复杂 不
  • 报错:Can‘t locate Win32/Console.pm in @INC (you may need to install the Win32::Console module)

    安装Open SSL中执行命令 perl Configure VC WIN32 no asm prefix C Dpan javaProject OpenSSL openssl 1 1 1b 出现以下错误 Can t locate Win3
  • Hi3516全系统类型烧录教程

    烧录资料下载 https gitee com hihope iot docs tree master HiSpark AI Camera Developer Kit Software tools 第一步 安装好hitool usb 烧写的驱
  • 鼠标右键添加git

    1 打开注册表 win R 输入regedit 2 找到HKEY CLASSES ROOT Directory Background目录 3 查看是否有shell这个目录 如果没有就添加 4 在shell目录下添加 项 鼠标右键点击新建 项
  • java-IO流(5)-IO流中的设计模式(装饰器模式和适配器模式)的介绍

    目录 1装饰器模式 1 1定义 1 2代码实现 1 3装饰器特点 1 4装饰器在IO流中的使用 2配适器模式 2 1Adapter适配器 2 2代码实例 2 3适配器特点 2 4适配器优缺点 2 5适配器在IO中的使用 3装饰器与适配器异同
  • C++中STL的string vector使用笔记

    文章目录 容器 STL使用的基本方式 常用容器的基本概念和使用 string容器的特性 string初始化 拼接 赋值 查找 初始化 赋值操作 取值操作 拼接操作 查找 string替换 比较 字串 插入和删除 替换 比较 截取子串 插入删