初识string(一)and内存管理

2024-09-07 02:20
文章标签 初识 内存 string 管理

本文主要是介绍初识string(一)and内存管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对类和对象的补充:缺省参数在函数定义中从右向左依次赋值,如果从右向左有一个参数没有赋值缺省参数,则左边的变量就不能在赋缺省参数,类中的变量可以赋缺省参数并且没有限制。

在类定义中我们总是看到函数后加const。这其实是调用常量类对象或类对象的意思。

一、引言

俗话说“工欲善其事,必先利其器。”一门语言创造的初衷一定是为了交流和记录重要的事。计算机语言肯定也不例外,虽然计算机语言创造的初衷单纯只是为了和计算机交流,让计算机代替人类进行复杂的运算。但渐渐的记录存储功能开始成为计算机的一大功能。计算机毕竟是外国人进行研究的外国人自然而然会为了更好的存储文字、修改文字、加密文字、删除文字创造出新的类。

二、string的介绍

string英文单词的释义是字符串。在C语言中的字符数组要想快速改变内容先不说是否要进行扩容,但是修改值都变得异常困难。所以在C++中提供了string类,方便了字符串的修改与删除。

在此接触string之前,我们先要了解内存管理——new和delete。还有一个operator new用的不是很多了解了解就行。

在C语言中我们用内存管理会用malloc()、calloc()、realloc()、free()等函数在内存的堆区申请空间。并且通过函数的返回值是否为空(NULL)来判断内存是否申请成功。

在C++中我们用new、operator new 、delete操作符进行内存管理。用抛异常来检查申请是否成功。下面是演示new和delete(如果申请的不止一个元素或是对象,析构时delete要则要加[],否则程序可能会崩溃。)操作符用法的代码。使用operrator new()和malloc()函数用法和操作是一样的,申请对应的空间大小强转返回值就行了。此外,new还可以用来申请类和对象空间,并且申请对象也会调用构造函数。

int* ptr = nullptr;
try//检测是否存在抛异常
{ptr = new int[n] {初始化值(如果是一个值初始化时用“()”)};//n为对象的个数
}
catch(const std::exception& e)//检测是否存在抛异常
{std::cout << e.what() << std::endl;
}
delete[] ptr;

下面我们就正式来进入string,首先我们需要包含头文件<string>因为C++有意作区分C语言和C++,所以string没有加.h后缀。

二、1        string文件中的那些函数

stoi()函数相当于C语言中的atoi()函数,将提取字符串的数字。返回值是个int类型。暂时只介绍这一个string文件中的函数。因为它相对于其他函数用的比较多。

二、2        string类对象的那些函数

一个类中一定会有构造函数、拷贝构造函数、析构函数、赋值运算符重载。这里就不一一介绍了。

我们先从最简单的访问函数size()和capacity(),用来访问类中的private变量或函数的数据来介绍。如果没有容积、大小的标示或是标示不统一,所有容器都只能凭借肉眼来一眼丁真。这非常的不方便。所以在string的类中会添加_size和_capacity变量来申请新的内存空间大小、访问内容、调整字符串的长度,同时不能被任意访问或修改,所以在private部分申明。

和字符数组一样,string也可以通过下标访问。另外可以通过string中的resize()函数来调整size的大小

#include<iostream>
#include<string>
int main()
{char ch[10] = "abcdefg";string s1(ch);for(int i = 0;i < s1.size();++i){std::cout << s1[i] << std::endl;}    return 0;
}

insert和erase则是在指定位置之前插入和在指定位置删除,返回值为插入或删除的值所在位置的迭代器。一种类似指针的类型变量我们还应该注意insert()和erase()如果扩容或是删除,可能会导致访问string的迭代器从原本的位置指向其他位置,也就是叫迭代器失效。

//迭代器的英文为iterator,故用它来定义迭代器变量。
//begin()和end()都是返回容器开头和结尾的迭代器函数。
string::iterator (变量名) = (类对象名).begin();
使用示例:
用迭代器打印string中的字符
#include<string>int main()
{std::string s1("abcdefg");std::string::iterator it = s1.begin();while(it != s1.end()){std::cout << it << " ";++it;}return 0;
}

push_back()则是向单个字符元素后插入。

string s1;
s1.push_back('a');

+=则可以向后插入字符串、字符都可以。

std::string s1;
s1 += "abcdefg";
s1 += 'a';

substr()则是对字符串中的开始提取字符,第一个参数是下标,第二个参数则是结束位置的下标。

std::string s1("abcdefg");
//提取s1中的所有字符
std::string s2 = s1.substr(0);
//提取s1中下标为1到下标为三的字符
std::string s3 = s1.substr(1,3);

find()函数则是查找字符串或是字符。第一个参数是字符或字符串,第二个参数则是开始位置的下标。

std::string s1("abcdefg");
//从下标为零的的位置开始查找字符或字符串
size_t pos = s1.find('c');
//从下标为一的的位置开始查找字符或字符串
size_t pos = s1.find('c',1);

c_str()则是返回类对象中的字符串。

std::string s1("abcdefghjijk");
//打印string中的字符串
std::cout << s1.c_str() << std::endl;

这些函数都是需要string类对象用点(.)操作符访问的。

这篇关于初识string(一)and内存管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143778

相关文章

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

在macOS上安装jenv管理JDK版本的详细步骤

《在macOS上安装jenv管理JDK版本的详细步骤》jEnv是一个命令行工具,正如它的官网所宣称的那样,它是来让你忘记怎么配置JAVA_HOME环境变量的神队友,:本文主要介绍在macOS上安装... 目录前言安装 jenv添加 JDK 版本到 jenv切换 JDK 版本总结前言China编程在开发 Java

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

java内存泄漏排查过程及解决

《java内存泄漏排查过程及解决》公司某服务内存持续增长,疑似内存泄漏,未触发OOM,排查方法包括检查JVM配置、分析GC执行状态、导出堆内存快照并用IDEAProfiler工具定位大对象及代码... 目录内存泄漏内存问题排查1.查看JVM内存配置2.分析gc是否正常执行3.导出 dump 各种工具分析4.

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.