【C++】 list 与 string 基础与实现字符串操作

【C++】使用 list 与 string 实现基础字符串操作

文章目录

    • 一、字符串的基础操作
      • 1.1 - startsWith
      • 1.2 - endsWith
      • 1.3 - trim
      • 1.4 - indexOf
      • 1.5 - replaceAll
    • 二、list 基础操作
      • 2.1 - 遍历
        • 2.1.1 - 使用迭代器访问
        • 2.1.2 - 使用基于范围的 for 循环遍历
        • 2.1.3 - 使用标准算法库遍历
      • 2.2 - 访问元素
      • 2.3 - 删除元素
    • 三、list\<string\>
      • 3.1 - 移除所有空字符串元素
      • 3.2 - 遍历字符串并应用 trim
      • 3.3 - 移除连续的空白行

一、字符串的基础操作

1.1 - startsWith

bool startsWith(const std::string& fullString, const std::string& starting)
{if (fullString.length() >= starting.length()) {return (0 == fullString.compare(0, starting.length(), starting));} else {return false;}
}

1.2 - endsWith

bool endsWith(const std::string& fullString, const std::string& ending) {if (fullString.length() >= ending.length()){return (0 == fullString.compare(fullString.length() - ending.length(), ending.length(), ending));}else{return false;}
}

1.3 - trim

用于移除字符串前后两端的空白符

// Function to trim whitespace from the beginning and end of a string
std::string trim(const std::string& str) {size_t first = str.find_first_not_of(" \t\n\r\f\v");// No non-whitespace charactersif (first == std::string::npos){    // 如果从头开始非空白符找不到,说明所有的字符都是空白符,因此全部去掉return "";  }size_t last = str.find_last_not_of(" \t\n\r\f\v");// 即便 last 为 string::npos substr 也会做处理。return str.substr(first, (last - first + 1));
}

或者

#include <algorithm>
#include <cctype>// 去除字符串左侧空白
static inline void ltrim(std::string &s) {s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](unsigned char ch) {return !std::isspace(ch);}));
}// 去除字符串右侧空白
static inline void rtrim(std::string &s) {s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char ch) {return !std::isspace(ch);}).base(), s.end());
}// 去除字符串两侧空白
static inline void trim(std::string &s) {ltrim(s);rtrim(s);
}

1.4 - indexOf

用于获取第一个子串的位置索引,如果找不到则返回 -1。

// Function to find the index of the first occurrence of a substring
int indexOf(const std::string& str, const std::string& substr)
{size_t pos = str.find(substr);return (pos != std::string::npos) ? static_cast<int>(pos) : -1;
}

1.5 - replaceAll

// 替换字符串中所有匹配的子字符串
void replaceAll(std::string& source, const std::string& from, const std::string& to)
{// 如果字符串为空则返回。if (from.empty()) { return; }size_t startPos = 0;while ((startPos = source.find(from, startPos)) != std::string::npos) {source.replace(startPos, from.length(), to);startPos += to.length(); // 在替换后移动过去新增的部分}
}

二、list 基础操作

2.1 - 遍历

2.1.1 - 使用迭代器访问
#include <iostream>
#include <list>
std::list<int> myList = {1, 2, 3, 4, 5};// 使用迭代器遍历 std::list
for (auto it = myList.begin(); it != myList.end(); ++it)
{std::cout << *it << " ";
}
std::cout << std::endl;
2.1.2 - 使用基于范围的 for 循环遍历
#include <iostream>
#include <list>
// 使用范围基 for 循环遍历 std::list
for (int elem : myList) 
{std::cout << elem << " ";
}
std::cout << std::endl;
2.1.3 - 使用标准算法库遍历
#include <iostream>
#include <list>
#include <algorithm> // for std::for_each
std::list<int> myList = {1, 2, 3, 4, 5};// 使用 std::for_each 遍历 std::list
std::for_each(myList.begin(), myList.end(), [](int elem) {std::cout << elem << " ";
});
std::cout << std::endl;

2.2 - 访问元素

访问第 N 个元素

#include <iostream>
#include <list>std::list<int> myList = {10, 20, 30, 40, 50};
int N = 3;  // 以 0 为起始索引,访问第 4 个元素
auto it = myList.begin();
std::advance(it, N);  // 使用 std::advance 前进到第 N 个元素if (it != myList.end()) {std::cout << "The element at index " << N << " is " << *it << std::endl;
} else {std::cout << "Index out of range." << std::endl;
}

2.3 - 删除元素

删除前 N 个元素

std::list<int> myList = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int N = 3;  // 指定要删除的元素数量
if (N <= myList.size()) {// 获取开始到第 N 个元素的迭代器auto it = myList.begin();std::advance(it, N);  // 移动迭代器到第 N 个位置// 从开始到第 N 个元素进行删除myList.erase(myList.begin(), it);
}// 打印剩余的元素
for (int elem : myList) {std::cout << elem << " ";
}
std::cout << std::endl;

三、list<string>

3.1 - 移除所有空字符串元素

#include <iostream>
#include <list>
#include <string>// 创建并初始化一个 std::list<std::string>
std::list<std::string> strings = {"Hello", "", "World", "", "C++17", ""};
// 输出原始列表
std::cout << "Original list:" << std::endl;
for (const auto& str : strings)
{std::cout << "'" << str << "'" << std::endl;
}
// 移除所有空字符串
strings.remove_if([](const std::string& s) { return s.empty(); });
// 输出修改后的列表
std::cout << "\nList after removing empty strings:" << std::endl;
for (const auto& str : strings) {std::cout << "'" << str << "'" << std::endl;
}

3.2 - 遍历字符串并应用 trim

std::list<std::string> myStrings = {"  hello  ", "  world!  ", "  example  "};// 遍历列表并应用 trim 函数
for (std::string& str : myStrings) {trim(str);
}
// 打印修剪后的字符串列表
for (const auto& str : myStrings) {std::cout << '"' << str << '"' << std::endl;
}

3.3 - 移除连续的空白行

将多个连续的空白行替换为一个空白行

#include <iostream>
#include <list>
#include <string>
#include <iterator>void compressEmptyLines(std::list<std::string>& lines) {bool lastWasEmpty = false;for (auto it = lines.begin(); it != lines.end(); ) {// 检查当前行是否为空白(或只包含空格)bool isEmpty = it->find_first_not_of(" \t\n\v\f\r") == std::string::npos;if (isEmpty) {if (lastWasEmpty) {// 如果当前行是空的,并且上一行也是空的,删除当前行it = lines.erase(it);} else {// 如果当前行是空的,但上一行不是,保留这行并标记lastWasEmpty = true;++it;}} else {// 如果当前行不是空的,继续前进lastWasEmpty = false;++it;}}
}int main() {std::list<std::string> lines = {"Hello"," "," ","World","","","!"," ","End"};compressEmptyLines(lines);// 输出处理后的列表for (const auto& line : lines) {std::cout << '"' << line << '"' << std::endl;}return 0;
}

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

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

相关文章

Elasticsearch中什么是倒排索引?

倒排索引&#xff08;Inverted Index&#xff09;是一种索引数据结构&#xff0c;它在信息检索系统中被广泛使用&#xff0c;特别是在全文搜索引擎中。倒排索引允许系统快速检索包含给定单词的文档列表。它是文档内容&#xff08;如文本&#xff09;与其存储位置之间的映射&…

【Python特征工程系列】利用SHAP进行特征重要性分析-XGB模型为例(案例+源码)

这是我的第374篇原创文章。 一、引言 SHAP有多种实现方式&#xff0c;每种方式都适用于特定的模型类型&#xff0c;可以实现更快的逼近。 TreeExplainer :TreeExplainer专为树集合方法开发&#xff0c;如XGBoost&#xff0c;LightGBM或CatBoost。 DeepExplainer :DeepExplain…

C++数据结构算法学习

C ,orient(面向) object , object entity(实体) Visible(可见的) or invisible(不可见) 变量用来保存数据 objects attribute(属性) services(服务) C STL 容器 vector, list&#xff08;&#xff09; vector底层是数组&#xff0c;类似双向链表和list底层 map/s…

ELK-Logstash配置

文章目录 一、什么是Logstash、有什么用&#xff1f;什么是 Logstash&#xff1f;Logstash 的主要特点&#xff1a;Logstash 的用途&#xff1a; 二、Logstash的安装与基本配置事先要安装Java的环境&#xff1f;Logstash 安装Debian/UbuntuRed Hat/CentOSmacOS&#xff08;使用…

R语言机器学习与临床预测模型69--机器学习模型解释利器:SHAP

R小盐准备介绍R语言机器学习与预测模型的学习笔记&#xff0c; 快来收藏关注【科研私家菜】 01 机器学习的可解释性 对于集成学习方法&#xff0c;效果虽好&#xff0c;但一直无法解决可解释性的问题。我们知道一个xgboost或lightgbm模型&#xff0c;是由N棵树组成&#xff0c;…

Vue自定义指令详解——以若依框架中封装指令为例分析

自定义指令 在Vue.js中&#xff0c;自定义指令提供了一种非常灵活的方式来扩展Vue的功能。以下是对Vue中自定义指令的详细解释&#xff1a; 一、自定义指令的基本概念 自定义指令允许开发者直接对DOM元素进行低层次操作&#xff0c;而无需编写大量的模板或者JavaScript代码。…

sql server启用远程连接与修改默认端口

一&#xff0c;数据库右键属性 二&#xff0c;sa账号状态属性启用 三&#xff0c;SQL Server配置管理器, 点击SQL Server 服务选项&#xff0c;确定SQL Server是正在运行的。 四&#xff0c;手动修改数据库的连接端口 1&#xff09;确保启用 2)修改默认端口 3)客户端IP改为一…

吴恩达机器学习笔记(3)

吴恩达机器学习&#xff08;3&#xff09; tensorflow实现 用 TensorFlow 实现神经网络 以下是一个完整的代码示例&#xff0c;展示如何使用 TensorFlow 和 Keras 构建和训练一个简单的神经网络来处理 MNIST 数据集&#xff1a; import tensorflow as tf from tensorflow.k…

【入门篇】A+B Problem——多语言版

AB Problem 跳转 题目分析&#xff1a; 这个题目要求输入两个整数 a 和 b&#xff0c;然后输出它们的和。需要注意的是 a 和 b 的绝对值都不超过 10^9。此外&#xff0c;题目中提到了 Pascal 使用 integer 类型可能会爆掉&#xff0c;说明需要使用更大范围的数据类型来处理这…

Matlab实现鹈鹕优化算法(POA)求解路径规划问题

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 鹈鹕优化算法&#xff08;POA&#xff09;是一种受自然界鹈鹕捕食行为启发的优化算法。该算法通过模拟鹈鹕群体在寻找食物时的协作行为&#xff0c;如群飞、潜水和捕鱼等&#xff0c;来探索问题的最优解。POA因其…

LED和QLED的区别

文章目录 1. 基础背光技术2. 量子点技术的引入3. 色彩表现4. 亮度和对比度5. 能效6. 寿命7. 价格总结 LED和 QLED都是基于液晶显示&#xff08;LCD&#xff09;技术的电视类型&#xff0c;但它们在显示技术、色彩表现和亮度方面有一些关键区别。以下是两者的详细区别&#xff…

《JavaEE进阶》----20.<基于Spring图书管理系统①(登录+添加图书)>

PS&#xff1a;关于接口定义 接口定义&#xff0c;通常由服务器提供方来定义。 1.路径&#xff1a;自己定义 2.参数&#xff1a;根据需求考虑&#xff0c;我们这个接口功能完成需要哪些信息。 3.返回结果&#xff1a;考虑我们能为对方提供什么。站在对方角度考虑。 我们使用到的…

OpenEuler 下 Docker 安装、配置与测试实例

文章目录 前言1. 环境准备2. 下载 Docker3.配置服务文件4.配置加速器加速下载docker镜像5. 验证 Docker 安装 前言 Docker 安装大致分为包管理器安装、脚本安装、离线手动安装、容器编排工具安装、桌面版安装等&#xff0c;每种安装各有特点&#xff0c;但涉及知识面不少&…

如何线程安全的使用HashMap

前言 Map一直是面试中经常被问到的问题。博主在找工作的过程中&#xff0c;就被问到了这样一个问题&#xff1a; Map是线程安全的吗&#xff1f;我不考虑使用线程安全的Map(eg&#xff1a;ConcurrentHashMap) 。如何在多线程/高并发下安全使用 HashMap&#xff1f; 当时博主…

Android CarrierConfig 参数项和正则匹配逻辑

背景 在编写CarrierConfig的时候经常出现配置不生效的情况&#xff0c;比如运营商支持大范围的imsi&#xff0c;或者是测试人员写卡位数的问题等等&#xff0c;因此就需要模式匹配&#xff08;包含但不限于正则表达式&#xff09;。 基本概念: 模式匹配涉及定义一个“模式”&a…

现代Web开发:Vue 3 组件化开发实战

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 现代Web开发&#xff1a;Vue 3 组件化开发实战 现代Web开发&#xff1a;Vue 3 组件化开发实战 现代Web开发&#xff1a;Vue 3 组…

吾店云介绍 – 中国人的WordPress独立站和商城系统平台

经过多年在WordPress建站领域的摸索和探索&#xff0c;能轻松创建和管理各种类型网站的平台 – 吾店云建站平台诞生了。 应该说这是一个艰苦卓绝的过程&#xff0c;在中国创建一个能轻松创建和使用WordPress网站的平台并不容易&#xff0c;最主要是网络环境和托管软件的限制。…

「QT」几何数据类 之 QLine 整型直线类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

游戏引擎学习第五天

这节貌似没讲什么 视频参考:https://www.bilibili.com/video/BV1Gmm2Y5EwE/ uint8 *A somewhere in memory; uint8 *B somewhere in memory;//BEFORE WE GOT TO HERE int Y *B; // whatever was actually there before the 5 *A 5; int X *B; // 5 //Obviously! Y and …

uniapp分享功能

页面生命周期 https://uniapp.dcloud.net.cn/tutorial/page.html#lifecycle onShareTimeline 监听用户点击右上角转发到朋友圈 微信小程序 2.8.1 onAddToFavorites 监听用户点击右上角收藏 微信小程序、QQ小程序 2.8.1 onShareAppMessage 用户点击右上角分享 微信小程序、QQ小程…