初始C++中的string与迭代

embedded/2024/9/23 13:13:44/

常用的string构造相关类的接口

string类是一个管理字符串的字符数组,string类的出现方便管理我们日常所遇见的,字符名,字符串等等。下面们介绍一下常见的string类接口。

string();

默认构造,构造空的string类

int main()
{
    string s1;
    cout << s1 << endl;
    return 0;
}

string (const string& str);

拷贝构造,构造一个和已存在的string对象一模一样的对象。

int main()
{
    string s1("abcd");
    cout << s1 << endl;
    return 0;
}

 string (const string& str, size_t pos, size_t len = npos);

从字符串的pos位置拷贝n个字符到字符串str上,pos是所拷贝的位置len是所拷贝的长度。这里涉及到一个特殊的玩法,拷贝的长度如果大于字符串剩余的,这种情况并不会报错,会拷贝所以剩下的所有。还有一种情况,传入时若长度并未传入,也是会直接拷贝到字符串'\0'的位置

int main()
{
    string s1("abcd",1,5);
    cout << s1 << endl;
    return 0;
}

string (const char* s);

用字符串来构造类对象

int main()
{
    char s1[] = "abcdfg";
    string s2(s1);
    cout << s2 << endl;
    return 0;
}

string (const char* s, size_t n);

s所指向字符串(或字符数组)的前n个来初始化创建一个string类对象。

int main()
{
    char s1[] = "abcdfg";
    string s2(s1,3);
    cout << s2 << endl;
    return 0;
}

string (size_t n, char c);

n个字符进行初始化

int main()
{
    string s1(5,'a');
    cout << s1 << endl;
    return 0;
}

 

常用的string遍历相关类的接口

1.[]+下标

[ ]+下标本质是调用函数string::operator[],operator[]的返回值是一个引用,所以可以通过[]加下标的方式去访问和修改string类对象。string::operator[]即可以针对普通对象也可针对const对象。 [ ]+下标的方法适用于底层是连续的字符串这种情况。

补充[ ]与at的区别:在越界时[]会触发底层的断言,而at要通过捕获后显示。

int main()
{
    //遍历方式
    string s1("hello");
    for (size_t i=0; i < s1.size(); i++)
    {
        s1[i]++;
        cout << s1[i] << " ";
    }
    cout << endl;

    return 0;
}

2.迭代器

迭代器可以理解一种指针的东西,它本身并不一定是指针,是不是指针取决与底层。

string::iterator 变量名 = s1.begin();

int main()
{//迭代器的用法string s1("hello");string::iterator s = s1.begin();//起始位置while (s!=s1.end())//字符串最后一个字符的下一个位置{cout << *s << " ";cout << ++(*s) << " ";//字符串++的情况s++;}cout << endl;return 0;
}

上述案例中是否可以把s!=s1.end()改为s<s1.end

这里我们要明白是迭代器的底层并不是指针,在数组中这中情况是可以的,因为数组是空间是连续的,但是在链表中就不可以了。下面使用list进行验证一下底层到底是不是指针,这里我们通过对比可以看出,底层不是指针,如果是指针解引用不就是节点了吗?

“语法糖”

auto

auto的用法是可以自动识别右侧的类型,简化代码,代替写起来长的类型。

int i=10;

auto a=1;//int

auto b=1.0;//double

auto &c=i;//int &

auto f=c//int

auto &d=c;//int &

auto e=&i;//int *

范围for

//自动进行遍历,自动取出容器的值给左边的值

//自动++,自动判读结束

//适用于容器和数组,范围for底层是迭代器

for(auto 变量名:容器名);

 如何实现修改

遍历for是自动取出容器的值给左边的对象,拷贝的值进行自增并不会影响容器的值,所以这里采用引用。

添加引用的两种情况

  1. 拷贝的数的较大时这种情况拷贝太难处理
  2. 要进行修改

 反向迭代器

reverse_iterator rbegin();

int main()
{string s("abcde");std::string::reverse_iterator rit = s.rbegin();//auto rit=s.rbegin();while (rit != s.rend()){cout << *rit << " ";rit++;//注意这里是++而不是--}cout << endl;return 0;
}

 rebegin()底层实现的图像解析,这里只是逻辑这样实现的,底层不一定是这样实现的。

const_ reverse_iterator rbegin();

const_ reverse_iterator rbegin();与reverse_iterator rbegin();功能一样,前者实现的不能进行修改。

插入用法

插入单个字符

s.push_back('x');

插入字符串

 operator+=insert插入

 上述的几种对数组的插入都是尾插,insert可以对不同位置进行插入。

int main()
{string s1("abcde");string s2("efg");//在指定位置插入字符串s1.insert(1, s2);cout << s1 << endl;//在指定位置插入指定长度,指定位置一段字符串s1.insert(1, s2, 1, 2);cout << s1 << endl;//指定位置插入一段字符串s1.insert(1, "xxx");cout << s1 << endl;//指定位置插入长度为n的一段字符串s1.insert(1, "xxx", 1);cout << s1 << endl;//指定位置插入n个字符s1.insert(s1.begin(), 3, '1');cout << s1 << endl;return 0;
}

实战演练

1.用C++实现仅仅反转字母

 字符串相加
 代码优化:

 通过insert进行的插入是头插入,头插对于字符的处理时后面的字符要向后移动,因此头插入的时间复杂度在本题是0(n^{2}),但是通过尾插是0(n),虽然尾插不是我们预期的,但是可以调用reverse模板进行反转。

 总结

以上就是本期的主要内容主要介绍了string常用的基础用法,以及迭代的实现介绍。由于string具有较多的接口,这里不进行一一介绍,可以通过此处传送门进入Cplusplus官网进行查阅。最后期待各位大佬的一键三连(点赞,收藏,关注)。


http://www.ppmy.cn/embedded/115604.html

相关文章

力扣206.反转链表

力扣《反转链表》系列文章目录 刷题次序&#xff0c;由易到难&#xff0c;一次刷通&#xff01;&#xff01;&#xff01; 题目题解206. 反转链表反转链表的全部 题解192. 反转链表 II反转链表的指定段 题解224. 两两交换链表中的节点两个一组反转链表 题解325. K 个一组翻转…

【计算机网络 - 基础问题】每日 3 题(十六)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

一文详解大语言模型Transformer结构

目录 1. 什么是Transformer 2. Transformer结构 2.1 总体结构 2.2 Encoder层结构 2.3 Decoder层结构 2.4 动态流程图 3. Transformer为什么需要进行Multi-head Attention 4. Transformer相比于RNN/LSTM&#xff0c;有什么优势&#xff1f;为什么&#xff1f; 5. 为什么说Transf…

【tomcat】tomcat学习笔记

文章目录 1.tomcat乱码问题1.1 linux乱码中文显示乱码问号问题1.2windows乱码1.2.1 方式一1.2.2方式二 1.3 Idea中运行tomcat乱码问题 2. 获取tomcat启动端口号3. idea运行tomcat 的配置问题4.dockerfile构建tomcat镜像问题4.1 替换端口号 5.启动多个tomcat方法6.修改tomcat JA…

高速服务区生活废水处理设备产地货源

诸城市鑫淼环保小编带大家了解一下高速服务区生活废水处理设备产地货源 高速公路服务区生活污水处理设备是专门针对高速公路服务区产生的生活污水进行处理的设备。这些设备通常具备高效、稳定、环保等特点&#xff0c;以确保服务区产生的污水能够得到有效处理&#xff0c;达到排…

蜗牛兼职网:Spring Boot框架应用

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;蜗牛兼职网当然也不能排除在外。蜗牛兼职网是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;…

TIOBE 编程指数 9 月排行榜公布 VB.Net第七

原文地址&#xff1a;百度安全验证 IT之家 9 月 8 日消息&#xff0c;TIOBE 编程社区指数是一个衡量编程语言受欢迎程度的指标&#xff0c;评判的依据来自世界范围内的工程师、课程、供应商及搜索引擎&#xff0c;今天 TIOBE 官网公布了 2024 年 9 月的编程语言排行榜&#xf…

搜维尔科技:工程师已经解决OptiTrack捕捉过程中肘部不自然的弯曲

工程师已经解决OptiTrack捕捉过程中肘部不自然的弯曲 搜维尔科技&#xff1a;工程师已经解决OptiTrack捕捉过程中肘部不自然的弯曲