【C++精华铺】9.STL string

这篇具有很好参考价值的文章主要介绍了【C++精华铺】9.STL string。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. string类的优势

2. string类的常用接口

2.1 常用构造

1. 空串构造:string();

2. C串构造:string(const char* s);

3. 拷贝构造:string(const string& str);

4. 字符填充构造:string(size_t n, char c);

5. 迭代器构造:string(InputIterator first, InputIterator last);

2.2  string容量操作

1. size_t size(),size_t length()

 2. size_t capacity() const

 3. bool empty() const

 4. void clear()

 5. void reserve(size_t n = 0)

 6. void resize(size_t n), void resize(size_t char c)

2.3 类对象的访问

1. char& operator[](size_t pos),const char& operator[](size_t pos) const

 2. begin()、end()

 3. rbegin()、rend()

2.4 string对象处理函数

1. push_back()

2. append()

 3. operator+=

 4. c_str()

 5. insert()

6. erase()

7. find()、rfind()

8. substr()

9. getline()


1. string类的优势

         STL(Standard Template Library)库中的string类是一个字符串类,它提供了管理字符串的各种方法和功能。它是一个可变长度的字符序列,可以自动调整自身大小以适应字符串的长度变化。

        在之前我们操作字符串都是通过自己去实现相关的函数来进行操作,而且稍不留神就会内存泄漏,在C++中我们更倾向于使用string类来完成和字符串相关的操作。

        使用string类相比于使用C语言的字符串有以下优点:

  1. 更加安全:C语言的字符串没有自带长度信息,容易造成内存越界等安全问题。而string类包含有字符串长度信息,能够避免这类问题。

  2. 更加方便:C语言中处理字符串需要使用一系列函数,如strlen、strcmp、strcat等等,使用起来比较繁琐。而string类提供了一系列方法,如length、compare、append等等,使用起来更加直观方便。

  3. 更加灵活:string类可以动态地改变字符串的长度,而C语言的字符串长度通常是固定的。

  4. 更加高效:string类内部实现了很多优化,如字符串复制采用了引用计数和写时复制等技术,因此性能相对于C语言的字符串更高。

2. string类的常用接口

2.1 常用构造

        C++98中支持7种构造函数 ,如下:

  1. default (1)  string();
  2. copy(2) string(const string& str);
  3. substring(3) string(const string& str, size_t pos, size_t len = npos);
  4. from c - string(4) string(const char* s);
  5. from sequence(5) string(const char* s, size_t n);
  6. fill(6) string(size_t n, char c);
  7. range(7) template <class InputIterator>                                                   string(InputIterator first, InputIterator last);

         但是我们只对其中的五个进行讲解:

1. 空串构造:string();

        这个构造函数会构造一个空字符串,长度为0个字符,但是容量不一定为零,比如在vs下空string对象的容量是15,不同环境可能有所不同,主要为了避免频繁的扩容操作。

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1; //创建一个空字符串
	cout << s1 << endl;
	cout << s1.capacity() << endl;
}

 输出:

【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构

2. C串构造:string(const char* s);

        以null结尾的字符序列(C串)构造string对象。

int main()
{
	string s1("hello world!");
	cout << s1 << endl;

}

输出:

【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构

3. 拷贝构造:string(const string& str);

        利用一个已经存在的string对象构造对象。

int main()
{
	string s1("hello world!");
	cout << s1 << endl;
	string s2(s1);
	cout << s2 << endl;
}

 输出:【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构

4. 字符填充构造:string(size_t n, char c);

         利用n个字符构造string对象。

int main()
{
	string s1(5, 'c');
	cout << s1 << endl;
}

输出:

【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构

5. 迭代器构造:template <class InputIterator>                                                                             string(InputIterator first, InputIterator last);

        使用迭代器区间来构造string对象。

int main()
{
	string s1(5, 'c');
	cout << s1 << endl;
	string s2(s1.begin(), s1.end());
	cout << s2 << endl;
}

输出:

【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构

2.2  string容量操作

1. size_t size(),size_t length()

        size()和length()都是返回字符串的有效字符长度,俩个函数的实现原理也完全相同,引入size()是为了和其他容器的接口保持一致。

int main()
{
	string s1(5, 'c');
	cout << s1.length() << endl;
	cout << s1.size() << endl;
}

输出:

【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构

 2. size_t capacity() const

        capacity()是返回空间的总大小,在vs下对象的初始容量是15,当存储的对象超过这个大小的时候才会去开空间,在新开的空间存储数据。

int main()
{
	string s1(5, 'c');
	cout << s1.capacity() << endl;
	string s2(16, 'c');
	cout << s2.capacity() << endl;
}

输出:

【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构

 3. bool empty() const

        检测字符串是否是空串,是返回true,不是返回false。

int main()
{
	string s1(5, 'c');
	if (s1.empty())
	{
		cout << "true" << endl;
		cout << "空" << endl;
	}
	else
	{
		cout << "false" << endl;
		cout << "非空" << endl;
	}
}

输出:

【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构

 4. void clear()

        清空对像中的有效字符。

int main()
{
	string s1("hello world!");
	cout << s1 << endl;
	cout << "--------------------------------" << endl;
	s1.clear();
	cout << s1 << endl;
}

输出:

【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构

 5. void reserve(size_t n = 0)

        reserve()是为了给对象预留空间,如果我们提前得知字符串需要的空间我们就可以提前开好,避免频繁扩容带来的性能消耗。当reserve的参数小于string底层空间大小的时候,reserve就不会对容量进行处理。(一般为了保障程序的安全性,reserve()会多开出一部分空间)。

int main()
{
	string s1(10,'x');
	s1.reserve(20);
	cout << s1.capacity() << endl;
	s1.reserve(2);
	cout << s1.capacity() << endl;
}

输出:

【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构

 6. void resize(size_t n), void resize(size_t char c)

        修改字符有效个数为n,多出的空间用字符c填充。如果n小于有效字符数,本质就是删字符操作。如果容量不够会扩容。

int main()
{
	string s1(10, 'x');
	cout << s1 << endl;
	s1.resize(20, 'c');
	cout << s1 << endl;
	s1.resize(2);
	cout << s1 << endl;
}

输出:

【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构

2.3 类对象的访问

1. char& operator[](size_t pos),const char& operator[](size_t pos) const

        返回pos位的字符,并且可以对非const对象进行修改。

int main()
{
	string s1(10, '1');
	cout << s1 << endl;
	s1[4] = '0';
	cout << s1 << endl;
	for (int i = 0; i < 10; i++)
	{
		cout << s1[i] << ' ';
	}
}

输出:

【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构

 2. begin()、end()

        begin()返回第一个字符位置的迭代器,end()返回最后一个字符的下一个位置的迭代器。begin()和end()都返回了自己的const版本。

int main()
{
	string s1(10, '1');
	auto it = s1.begin();
	for (; it < s1.end(); it++)
	{
		cout << *it;
	}
}

输出:

【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构

 3. rbegin()、rend()

        rbegin()获取一个反向迭代器,指向其反向开头,rend()获取一个反向迭代器,指向其反向结尾的前一个理论元素。

int main()
{
	string s1("123456789");
	cout << s1 << endl;
	auto it = s1.rbegin();
	for (; it < s1.rend(); it++)
	{
		cout << *it;
	}
}

输出:

【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构

2.4 string对象处理函数

1. push_back()

        在字符串后尾插字符c。

int main()
{
	string s1;
	s1.push_back('1');
	cout << s1;
}

输出:

【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构

2. append()

        append()函数在在C++98有六种重载形式,用于在字符串后追加一个字符串。

  1. string(1)       string& append(const string& str);
  2. substring(2) string& append(const string& str, size_t subpos, size_t sublen);
  3. c - string(3)  string & append(const char* s);
  4. buffer(4)       string& append(const char* s, size_t n);
  5. fill(5)             string& append(size_t n, char c);
  6. range(6)       template <class InputIterator>                                                                                           string& append(InputIterator first, InputIterator last);
int main()
{
	string s1("hello");
	string s2(" world");
	cout << s1 << endl;
	s1.append(s2); //在s1结尾追加一个s1
	cout << s1 << endl;
	s1.append(s2, 1, 2); //在s1结尾追加s1的下标为1往后的俩个字符
	cout << s1 << endl;
	s1.append("C串");   //在s1后追加一个C串
	cout << s1 << endl;
	s1.append("123456", 2);//在s1后追加字符串的前 n 个字符。
	cout << s1 << endl;
	s1.append(5, 'c');  //在s1后追加5个字符‘c’
	cout << s1 << endl;
	string s3("CSDN");
	s1.append(s3.begin(), s3.end());//在s1后追加一个迭代器区间
	cout << s1 << endl;
}

 输出:

【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构

 3. operator+=

        operator+=()和append()功能类似,都是在字符串后追加内容,但是我们在实际开发中更愿意使用operator+=。

int main()
{
	string s1("hello ");
	string s2("world!");
	s1 += s2;
	cout << s1 << endl;
}

输出:

【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构

 4. c_str()

        c_str()会返回string对象存储字符串的首地址,用户可以通过这个接口来适配c语言中的某些场景。

int main()
{
	string s1("hello world!");
	printf("%s", s1.c_str());
}

输出:

【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构

 5. insert()

        insert()支持在pos位对字符串进行插入操作,但是由于pos位插入涉及到元素的挪动,而挪动元素会使性能下降,所以insert()要少用。insert()有多种重载形式,如下:

  1. string(1)       string& insert(size_t pos, const string& str);
  2. substring(2) string& insert(size_t pos, const string& str, size_t subpos, size_t sublen);
  3. c - string(3)  string & insert(size_t pos, const char* s);
  4. buffer(4)       string& insert(size_t pos, const char* s, size_t n);
  5. fill(5)             string& insert(size_t pos, size_t n, char c);                                                                       void insert(iterator p, size_t n, char c);
  6. single character(6) iterator insert(iterator p, char c);
  7. range(7)        template <class InputIterator>                                                                                          void insert(iterator p, InputIterator first, InputIterator last);
int main()
{
	string s1("string");
	cout << s1 << endl;
	s1.insert(2, "*********");
	cout << s1 << endl;
}

输出:

【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构

6. erase()

        erase()是删除字符串的一部分,但是不会改变string对象的容量,如果给的删除字符个数大于pos位后的字符个数,会将后面的全部删除。如果没有给pos位,则默认清空字符串。如果不给删除个数则默认是无符号整型npos(-1)即约等于42亿,就会将pos位后面的字符序列全部删除。

  1. sequence(1) string& erase(size_t pos = 0, size_t len = npos);
  2. character(2) iterator erase(iterator p);
  3. range(3)       iterator erase(iterator first, iterator last);
int main()
{
	string s1("1234567890");
	s1.erase(2, 3);//从pos位2开始依次删除三个字符,即删除"345"
	cout << s1 << endl;
	s1.erase(s1.begin() + 5);
	cout << s1 << endl;//删除迭代器位置的字符
	s1.erase(s1.begin(), s1.begin() + 2);//删除beigin()位置和后面1位字符
	cout << s1 << endl;
}

 输出:

【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构

7. find()、rfind()

        find()函数用于查找某字符串中是否包含某个字符或者字符串,会从pos位往后查找,rfind()则是从pos位往前查找。找到后会返回字符首次出现的pos位或者字符串首次出现的pos位。如果没有找到则会返回npos(无符号整型‘-1’)。

  1. string(1)       size_t find(const string& str, size_t pos = 0) const;
  2. c - string(2)  size_t find(const char* s, size_t pos = 0) const;
  3. buffer(3)       size_t find(const char* s, size_t pos, size_t n) const;
  4. character(4) size_t find(char c, size_t pos = 0) const;
int main()
{
	string s1("hello world");
	size_t pos = s1.find("llo", 0);
	cout << pos << endl;
}

输出:

【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构

8. substr()

        substr()会获取pos后包括pos位的n个字符并且返回一个string对象,如果没有给获取长度n,则会默认将后面的包括pos位的所有字符全部获取并且返回一个string对象。

  • string substr(size_t pos = 0, size_t len = npos) const;
int main()
{
	string s1("123456789");
	cout << s1 << endl;
	string s2(s1.substr(2, 5));
	cout << s2 << endl;
}

 输出:

【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构

9. getline()

         从 istream 中提取字符并将其存储到 str 中,直到找到分隔字符 delim(或 (2) 的换行符“\n”)。如果在 is 中到达文件末尾或在输入操作期间发生其他错误,则提取也会停止。如果找到分隔符,则将其提取并丢弃(即不存储它,下一个输入操作将在它之后开始)。请注意,调用之前的任何内容都将替换为新提取的序列。每个提取的字符都追加到字符串中,就像调用其成员push_back一样。(不以空格作为分隔符,可以读取空格符)

  • (1)istream& getline(istream& is, string& str, char delim);
  • (2)istream& getline(istream& is, string& str);

 【C++精华铺】9.STL string,STL,C++,c++,stl,数据结构文章来源地址https://www.toymoban.com/news/detail-675549.html

到了这里,关于【C++精华铺】9.STL string的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构与算法】C++的STL模板(迭代器iterator、容器vector、队列queue、集合set、映射map)以及算法例题

    更多算法例题链接: 【数据结构与算法】递推法和递归法解题(递归递推算法典型例题) 什么是迭代器(iterator) 迭代器(iterator)的定义: 迭代器是一种检查容器内元素并遍历元素的数据类型。 迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围。 容器

    2024年04月14日
    浏览(37)
  • 【c++】STL--string

            最开始我们学习c语言的时候,我们发现刷题或者写代码都是比较麻烦的,如果说用c语言造一辆车,那么我需要用c语言先把轮子造好--各个零件,当我们造好之后再组装。那么c++则是造好了轮子,只需要我们组装就好了。这里的的STL里有各个组件,我只要熟悉的掌握

    2024年02月03日
    浏览(38)
  • C++ STL string类

    目录 一.为什么学习string类 (1) C语言中的字符串 (2)标准库里面的string类 二. string类的常用接口说明 (1)string类对象的常见构造 (2)string类对象的容量操作 1.size(),length(). 2. capacity() 3.empty()  4.clear()  5.reserve()  6.resize() (3)string类对象的访问及遍历操作  1.operator[ pos

    2024年02月13日
    浏览(26)
  • 【C++】STL——string类详解

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🚁 个人主页:不 良 🔥 系列专栏:🛸C++  🛹Linux 📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与诸君一同

    2024年02月11日
    浏览(31)
  • C++ [STL之string的使用]

    本文已收录至《C++语言》专栏! 作者:ARMCSKGT 字符串在程序中经常出现,C语言为此提供了很多字符串操作函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问,于是STL单独为字符串实现了一个容器,

    2024年02月01日
    浏览(24)
  • C++ STL string类模拟实现

    目录 string类成员变量 一.构造函数 二.析构函数 三.拷贝构造 四.size(),capacity() 五.operator [ ] 六. operator =  七.字符串比较  八.reserve() 九.push_back(),append() 十.operator+=  十一.insert()  十二.迭代器  十二.erase() 十三.swap()  十四.find() 十五.流提取,流输出 十六

    2024年02月14日
    浏览(34)
  • 【C++】STL——string(两万字详解)

    🎇C++学习历程:STL——string学习 博客主页: 一起去看日落吗 持续分享博主的C++学习历程 博主的能力有限,出现错误希望大家不吝赐教 分享给大家一句我很喜欢的话: 也许你现在做的事情,暂时看不到成果,但不要忘记,树🌿成长之前也要扎根,也要在漫长的时光🌞中沉

    2024年01月25日
    浏览(36)
  • 【C++ • STL】探究string的源码

    ヾ(๑╹◡╹)ノ\\\" 人总要为过去的懒惰而付出代价 ヾ(๑╹◡╹)ノ\\\" 浅拷贝 :也称位拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就会导致多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,

    2024年02月08日
    浏览(27)
  • 【C++】STL之string类(1)

    个人主页:平行线也会相交💪 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C++之路】💌 本专栏旨在记录C++的学习路线,望对大家有所帮助🙇‍ 希望我们一起努力、成长,共同进步。🍓 接下来就开始STL部分的学习了,本文先来学习一下

    2024年02月11日
    浏览(34)
  • C++ [STL之string模拟实现]

    本文已收录至《C++语言》专栏! 作者:ARMCSKGT 前面我们介绍了STL容器string的部分接口使用,有了string使我们对字符串的操作如鱼得水,其实string不止于使用方便,其实现也有许多我们值得学习的地方,本节将为您介绍string常用接口的代码实现! 本文接口的实现借助于C++官方

    2024年02月05日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包