初识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

相关文章

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

在Node.js中使用.env文件管理环境变量的全过程

《在Node.js中使用.env文件管理环境变量的全过程》Node.js应用程序通常依赖于环境变量来管理敏感信息或配置设置,.env文件已经成为一种流行的本地管理这些变量的方法,本文将探讨.env文件... 目录引言为什么使php用 .env 文件 ?如何在 Node.js 中使用 .env 文件最佳实践引

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

k8s容器放开锁内存限制问题

《k8s容器放开锁内存限制问题》nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并... 目录问题问题确认放开容器max locked memory限制总结参考:https://Access

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象