C++:string的使用

目录

1、string的介绍

2、string的初始化 

2.1、方法1 

2.2、方法2

2.3、方法3

 2.4、方法4

  2.5、方法5

   2.6、方法6

3、string的赋值运算符重载

4、 string的常用内置函数使用 

 5、string的遍历

4.1数组下标访问

4.2迭代器 

4.3范围for 

 6、模拟实现MyString

6.1、头文件:MyString.h

6.2、源文件:MyString.cpp


1、string的介绍

string 是表示字符串的字符串类

2、string的初始化 

2.1、方法1 

    string();
//空字符串构造函数(默认构造函数),构造一个长度为零个字符的空字符串。string s;

2.2、方法2

    string(const string & str);
//拷贝构造函数,构造str的副本string s1(str);

2.3、方法3

    string(const string & str, size_t pos, size_t len = npos);
//子字符串构造函数,复制str中从字符位置pos开始并跨越len个字符的部分
//(如果str太短或len为string::npos,则复制到str的末尾)string s2(s, 1, 2);

 2.4、方法4

     string (const char* s);
//复制s指向的以'\0'结尾的字符序列string s3("A character sequence");string (const char* s, size_t n);
//从s指向的字符数组中复制前n个字符string s4("Another character sequence", 12);

  2.5、方法5

    string(size_t n, char c);
//用字符c的n个连续副本填充字符串。string s5(10, 'x');string s6(10, 100);    //100是ascll码值

   2.6、方法6

//迭代器初始化string(InputIterator first, InputIterator last);string s7(s.begin(), s.begin() + 7);

3、string的赋值运算符重载

    string str1, str2, str3;string & operator= (const char* s);str1 = "Test string: ";   string& operator= (char c);str2 = 'x';               string& operator= (const string & str);    str3 = str1 + str2; str3 = str1;      

4、 string的常用内置函数使用 

string v(10, 'x');string v1 = "www";//Iterators(迭代器)v.begin();          //获取第一个数的位置v.end();            //获取最后一个数的位置v.rbegin();         //获取最后一个数的位置v.rend();           //获取第一个数的位置//Capacity(容量)v.size();           //获取v数据的个数v.length();         //获取v数据的个数v.max_size();       //返回字符串可以达到的最大长度v.clear();          //擦除字符串的内容,该字符串将变为空字符串(长度为0个字符)v.capacity();       //获取v容量的大小v.empty();          //判断v是否为空v.resize(10);       //改变vector的size,将v的现有元素个数调整至10个,多则删,少则补,其值随机v.resize(10, 3);    //将v的现有元素个数调整至10个,多则删,少则补,并且赋值为3v.reserve(100);     //改变vector的capacity,将v的容量扩充至100//Element access(元素访问)v[0];               //下标访问v.at(3);            //返回对字符串中位置pos处的字符的引用//与下标访问的区别,函数会自动检查pos是否是字符串中字符的有效位置//(即pos是否小于字符串长度),如果不是,则抛出out_of_range异常                    //Modifiers(修改器)v += " K. ";                  //通过在字符串的当前值末尾附加附加字符来扩展字符串v.append(v1);                 //通过在字符串的当前值末尾附加附加字符来扩展字符串v.append(v1, 6, 3);                   v.append("dots are cool", 5);          v.append("here: ");                                      v.append(v1.begin(), v1.end());v.assign("c-string");          //为字符串指定一个新值,替换其当前内容v.swap(v1);                    //交换v.pop_back();                 //尾删v.push_back(5);               //尾插一个数,值为5v.insert(v.begin(), 2);       //在pos前插入元素,例如头插2v.erase(v.begin());           //删除pos位置的数据,例如头删//string operations(字符串操作)v.c_str();                   //字符转整型getline(cin, v);            //输入值到v中,直到回车

 5、string的遍历

4.1数组下标访问

string a("www.6666.hh");
for(int i = 0;i <= a.size() - 1;++i)
{cout << a[i] << endl;
}

4.2迭代器 

    string::iterator it = a.begin();while (it != a.end()){cout << *it << " ";++it;}cout << endl;

4.3范围for 

for (auto ch : a){cout << ch << " ";}cout << endl;

 6、模拟实现MyString

6.1、头文件:MyString.h

#pragma once
#include<assert.h>
#include <type_traits>
#include <ostream>
#include <istream>class MyString{public:typedef char* iterator;typedef const char* const_iterator;iterator begin(){return _str;}iterator end(){return _str + _size;}const_iterator begin() const{return _str;}const_iterator end() const{return _str + _size;}//MyString();MyString(const char* str = "");MyString(const MyString& s);~MyString();void swap(MyString& s);MyString& operator=(MyString tmp);char& operator[](size_t pos);const char& operator[](size_t pos) const;size_t capacity() const;size_t size() const;void reserve(size_t n);void resize(size_t n, char ch = '\0');void clear();size_t find(char ch, size_t pos = 0);size_t find(const char* sub, size_t pos = 0);void push_back(char ch);void append(const char* str);void insert(size_t pos, char ch);void insert(size_t pos, const char* str);void erase(size_t pos, size_t len = npos);MyString& operator+=(char ch);MyString& operator+=(const char* str);bool operator<(const MyString& s) const;bool operator==(const MyString& s) const;bool operator<=(const MyString& s) const;bool operator>(const MyString& s) const;bool operator>=(const MyString& s) const;bool operator!=(const MyString& s) const;MyString substr(size_t pos, size_t len = npos);const char* c_str() const;private:char* _str;size_t _size;size_t _capacity;public:const static size_t npos;};std::ostream& operator<<(std::ostream& out, const MyString& s);std::istream& operator>>(std::istream& in, MyString& s);

6.2、源文件:MyString.cpp

#include"MyString.h"const size_t MyString::npos = -1;
//MyString::MyString()
//	:_str(new char[1] {'\0'})
//	, _size(0)
//	, _capacity(0)
//{}MyString::MyString(const char* str):_size(strlen(str)), _capacity(_size)
{_str = new char[_capacity + 1];strcpy(_str, str);
}void MyString::swap(MyString& s)
{std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity);
}// s2(s1)
MyString::MyString(const MyString& s):_str(nullptr), _size(0), _capacity(0)
{MyString tmp(s._str);swap(tmp);
}// s2 = s3
MyString& MyString::operator=(MyString tmp)
{swap(tmp);return *this;
}MyString::~MyString()
{delete[] _str;_str = nullptr;_size = _capacity = 0;
}char& MyString::operator[](size_t pos)
{assert(pos < _size);return _str[pos];
}const char& MyString::operator[](size_t pos) const
{assert(pos < _size);return _str[pos];
}size_t MyString::capacity() const
{return _capacity;
}size_t MyString::size() const
{return _size;
}const char* MyString::c_str() const
{return _str;
}void MyString::reserve(size_t n)
{if (n > _capacity){char* tmp = new char[n + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;_capacity = n;}
}void MyString::resize(size_t n, char ch)
{if (n <= _size){_str[n] = '\0';_size = n;}else{reserve(n);while (_size < n){_str[_size] = ch;++_size;}_str[_size] = '\0';}
}size_t MyString::find(char ch, size_t pos)
{for (size_t i = pos; i < _size; i++){if (_str[i] == ch){return i;}}return npos;
}size_t MyString::find(const char* sub, size_t pos)
{const char* p = strstr(_str + pos, sub);if (p){return p - _str;}else{return npos;}
}MyString MyString::substr(size_t pos, size_t len)
{MyString s;size_t end = pos + len;if (len == npos || pos + len >= _size) // 有多少取多少{len = _size - len;end = _size;}s.reserve(len);for (size_t i = pos; i < end; i++){s += _str[i];}return s;
}void MyString::push_back(char ch)
{if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}_str[_size] = ch;++_size;_str[_size] = '\0';
}void MyString::append(const char* str)
{size_t len = strlen(str);if (_size + len > _capacity){reserve(_size + len);}strcpy(_str + _size, str);_size += len;
}MyString& MyString::operator+=(char ch)
{push_back(ch);return *this;
}MyString& MyString::operator+=(const char* str)
{append(str);return *this;
}// insert(0, 'x')
void MyString::insert(size_t pos, char ch)
{assert(pos <= _size);if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}size_t end = _size + 1;while (end > pos){_str[end] = _str[end - 1];--end;}_str[pos] = ch;_size++;
}void MyString::insert(size_t pos, const char* str)
{assert(pos <= _size);size_t len = strlen(str);if (_size + len > _capacity){reserve(_size + len);}// 挪动数据int end = _size;while (end >= (int)pos){_str[end + len] = _str[end];--end;}strncpy(_str + pos, str, len);_size += len;
}void MyString::erase(size_t pos, size_t len)
{assert(pos < _size);if (len == npos || pos + len >= _size){_str[pos] = '\0';_size = pos;}else{size_t begin = pos + len;while (begin <= _size){_str[begin - len] = _str[begin];++begin;}_size -= len;}
}bool MyString::operator<(const MyString& s) const
{return strcmp(_str, s._str) < 0;
}bool MyString::operator==(const MyString& s) const
{return strcmp(_str, s._str) == 0;
}bool MyString::operator<=(const MyString& s) const
{return *this < s || *this == s;
}bool MyString::operator>(const MyString& s) const
{return !(*this <= s);
}bool MyString::operator>=(const MyString& s) const
{return !(*this < s);
}bool MyString::operator!=(const MyString& s) const
{return !(*this == s);
}void MyString::clear()
{_str[0] = '\0';_size = 0;
}std::ostream& operator<<(std::ostream& out, const MyString& s)
{for (auto ch : s)out << ch;return out;
}std::istream& operator>>(std::istream& in, MyString& s)
{s.clear();char buff[129];size_t i = 0;char ch;ch = in.get();while (ch != ' ' && ch != '\n'){buff[i++] = ch;if (i == 128){buff[i] = '\0';s += buff;i = 0;}//s += ch;ch = in.get();}if (i != 0){buff[i] = '\0';s += buff;}return in;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/120918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP发起请求与收到响应的大致过程

可以《《透视 HTTP 协议》Windows 10 搭建最小实验环境》搭建环境&#xff0c;之后才能进行下边的操作。 1.鼠标左键点击两下www目录下的start.bat批处理文件。 2.打开Wireshark&#xff0c;然后选择Adapter for loopback traffic capture。 3.然后把tcp.port 80 || udp.…

碳排放数据,各地区的(直辖市数据细分到区县),含shp和xlsx格式,带符号化

这两天推了道路相关的数据&#xff0c;道路线路、客运飞机场、航空、地铁、火车站点等等交通出行类的数据之前都已发过&#xff0c;需要的可以自己翻一翻。 交通运输行业还比较关注的碳排放数据&#xff0c;也整理出来了&#xff0c;有需要的自取。 数据地址&#xff1a; 全…

项目管理工具ConceptDraw PROJECT mac中文版自定义列功能

ConceptDraw PROJECT Mac是一款专业的项目管理工具&#xff0c;适用于MacOS平台。它提供了成功规划和执行项目所需的完整功能&#xff0c;包括任务和资源管理、报告和变更控制。 这款软件可以与ConceptDraw office集成&#xff0c;利用思维导图和数据可视化的强大功能来改进项目…

Microsoft.Extensions 简介

Microsoft.Extensions 简介 一、Microsoft.Extensions 简介 .NET Extensions 是一套官方的、开源的、跨平台的 API 集合&#xff0c;提供了一些常用的编程模式和实用工具&#xff0c;例如依赖项注入、日志记录、缓存、Host以及配置等等。该项目的大多数 API 都被用在 .NET 平…

Python的快捷键

Python Python使用的小快招关于注释关于格式写主函数如何看函数源代码 Python使用的小快招 本文主要记录了写python代码的时候提高效率的一些小妙招 关于注释 选中要注释的代码&#xff0c;然后按下Ctrl /即可对多段代码注释。 关于格式 对于python代码的格式&#xff0c…

Jetpack:019-Jetpack的导航二(传递数据)

文章目录 1. 知识回顾2. 使用方法2.1 通过参数传递数据2.2 获取参数中的数据2.3 共享导航控制器 3. 示例代码4. 内容总结 我们在上一章回中介绍了Jetpack中导航相关的内容&#xff0c;本章回中 继续介绍导航相关的内容。闲话休提&#xff0c;让我们一起Talk Android Jetpack吧…

pre标签变成可以编辑的状态

一.只可编辑,粘贴复制字段长度不正常 <p contenteditable"true" >这是一个可编辑内容的p标签哦~</p> 二.既可编辑,又可粘贴复制,文本字段长度正常 <p contenteditable"plaintext-only" >这是一个可编辑内容的p标签哦~ </p>

reactNative导入excel文件

组件内导入 import {TouchableOpacity,PermissionsAndroid} from react-native; import RNFS from react-native-fs; import XLSX from xlsx; import DocumentPicker from react-native-document-picker; import {Buffer} from buffer;// 需要安装一下三个,Buffer和react-nati…

Node编写更新用户头像接口

目录 定义路由和处理函数 验证表单数据 ​编辑 实现更新用户头像的功能 定义路由和处理函数 向外共享定义的更新用户头像处理函数 // 更新用户头像的处理函数 exports.updateAvatar (req, res) > {res.send(更新成功) } 定义更新用户头像路由 // 更新用户头像的路由…

安装 tensorflow==1.15.2 遇见的问题

一、直接安装 命令&#xff1a;pip install tensorflow1.15.2 二、换 阿里云 镜像源 命令&#xff1a;pip install -i http://mirrors.aliyun.com/pypi/simple tensorflow1.15.2 三、换 豆瓣 镜像源 命令&#xff1a;pip install http://pypi.douban.com/simple tensorflow1…

【OpenCV实现平滑图像形态学变化】

文章目录 概要目标腐蚀膨胀开运算结构元素&#xff08;内核&#xff09;小结 概要 形态学变化是一组简单的图像操作&#xff0c;主要用于处理二值图像&#xff0c;即只包含黑和白两种颜色的图像。这些操作通常需要两个输入&#xff0c;原始图像和一个内核&#xff08;kernel&a…

第13期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练 Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

接口自动化测试实战

实现思路 使用excel管理用例用例信息&#xff0c;requests模块发送http请求&#xff0c;实现了记录日志&#xff0c;邮件发送测试报告的功能 目录结构如下&#xff1a; 同时&#xff0c;我也准备了一份软件测试视频教程&#xff08;含接口、自动化、性能等&#xff09;&#…

MySQL 连接出现 Authentication plugin ‘caching_sha2_password的处理方法(使用第二种)

出现这个原因是mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password, 解决问题方法有两种,一种是升级navicat驱动,一种是把mysql用户登录密码加密规则还原成mysql_native_password. 1. 升级MySQL版本 较早的MySQL版本可能不…

2023-8-20 CVTE视源股份后端开发实习一面

自我介绍 操作系统 1 有了解进程和线程的特点吗 2 在linux层面的话是怎么创建一个进程或者一个线程的&#xff08;具体的系统调用的命令&#xff09; 答&#xff1a; 3 如果是java层面讲&#xff0c;怎么去启动一个线程&#xff0c;要实现哪些方法呢 Thread类实现run()方法的…

tmux和vim

本文旨在对y总的Linux基础课做学习记录&#xff0c;指令较多&#xff0c;方便日后查找。 参考视频&#xff1a;Linux基础课 参考教程&#xff1a;Linux教程 1 tmux 1.1 功能&#xff1a; ㅤㅤ&#xff08;1&#xff09;&#xff1a;分屏 ㅤㅤ&#xff08;2&#xff09;&…

L2-005 集合相似度

给定两个整数集合&#xff0c;它们的相似度定义为&#xff1a;Nc​/Nt​100%。其中Nc​是两个集合都有的不相等整数的个数&#xff0c;Nt​是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。 输入格式&#xff1a; 输入第一行给出一个正整数N…

TSINGSEE青犀老旧小区升级改造AI+视频监控方案

一、背景与需求 近年来&#xff0c;政府高度重视城镇老旧小区改造工作&#xff0c;强调要加快老旧小区改造&#xff0c;不断完善城市管理和服务&#xff0c;彻底改变粗放型管理方式&#xff0c;让人民群众在城市生活得更方便、更舒心、更美好。老旧小区升级改造面临以下问题&a…

Kotlin中使用ViewBinding绑定控件并添加点击事件

文章目录 效果1、加入依赖2、与控件进行绑定在 Activity 中使用视图绑定 3、监听控件 效果 实现源码 class MainActivity : AppCompatActivity() {lateinit var binding:ActivityMainBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstan…

计算机毕业设计 基于SpringBoot大学生创新创业项目管理系统的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…