IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> STL之String类 -> 正文阅读

[C++知识库]STL之String类

STL初识

一、什么是STL

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。

二、STL的六大组件

在这里插入图片描述

三、为什么学习string类

c语言中的字符串

C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。

string类的常用接口说明

string类对象的的常见构造
在这里插入图片描述

函数名称功能说明
string()构造空的string类对象,即空字符串
string(const char* s)用C-string来构造string类对象
string(const string&s)拷贝构造函数
string(size_t n, char c)string类对象中包含n个字符c
void Teststring()
{
 string s1; // 构造空的string类对象s1
 string s2("hello bit"); // 用C格式字符串构造string类对象s2
 string s3(s2); // 拷贝构造s3
}

string类对象的容量操作

函数名称功能说明
size(重点)返回字符串有效字符长度
length返回字符串有效字符长度
capacity返回空间总大小
empty (重点)检测字符串释放为空串,是返回true,否则返回false
clear (重点)清空有效字符
reserve (重点)为字符串预留空间**
resize (重点)将有效字符的个数该成n个,多出的空间用字符c填充
// size/clear/resize
void Teststring1()
{
 // 注意:string类对象支持直接用cin和cout进行输入和输出
 string s("hello, bit!!!");
 cout << s.size() << endl;
 cout << s.length() << endl;
 cout << s.capacity() << endl;
 cout << s <<endl;
 
 // 将s中的字符串清空,注意清空时只是将size清0,不改变底层空间的大小
 s.clear();
 cout << s.size() << endl;
 cout << s.capacity() << endl;
 // 将s中有效字符个数增加到10个,多出位置用'a'进行填充
 // “aaaaaaaaaa”
 s.resize(10, 'a');
 cout << s.size() << endl;
 cout << s.capacity() << endl;
 // 将s中有效字符个数增加到15个,多出位置用缺省值'\0'进行填充
 // "aaaaaaaaaa\0\0\0\0\0"
 // 注意此时s中有效字符个数已经增加到15个
 s.resize(15);
 cout << s.size() << endl;
 cout << s.capacity() << endl;
 cout << s << endl;
 // 将s中有效字符个数缩小到5个
 s.resize(5);
 cout << s.size() << endl;
 cout << s.capacity() << endl;
 cout << s << endl;
}
//================================================================================
====
void Teststring2()
{
 string s;
 // 测试reserve是否会改变string中有效元素个数
 s.reserve(100);
 cout << s.size() << endl;
 cout << s.capacity() << endl;
 // 测试reserve参数小于string的底层空间大小时,是否会将空间缩小
 s.reserve(50);
 cout << s.size() << endl;
 cout << s.capacity() << endl;
}
// 利用reserve提高插入数据的效率,避免增容带来的开销
//================================================================================
====
void TestPushBack()
{
 string s;
 size_t sz = s.capacity();
 cout << "making s grow:\n";
 for (int i = 0; i < 100; ++i)
 {
 s.push_back('c');
 if (sz != s.capacity())
 {
 sz = s.capacity();
 cout << "capacity changed: " << sz << '\n';
 }
 }
}
void TestPushBackReserve()
{
 string s;
 s.reserve(100);
 size_t sz = s.capacity();
 
 cout << "making s grow:\n";
 for (int i = 0; i < 100; ++i)
 {
 s.push_back('c');
 if (sz != s.capacity())
 {
 sz = s.capacity();
 cout << "capacity changed: " << sz << '\n';
 }
 }
}

三种遍历

1.下标+[]

int main()
{
	string s1;
	string s2("hello bit");
	//三种遍历
	//1、下标+[]
	for (size_t i = 0; i < s2.size(); ++i)
	{
		s2[i] = 'x';
	}
	cout << endl;
	for (size_t i = 0; i < s2.size(); ++i)
	{
		cout << s2[i] << " ";
	}
	cout << endl;
	return 0;
}

2.迭代器
[begin(),end()) end()返回的不是最后一个数据位置的迭代器,返回是最后一个位置的下一个位置。
迭代器的用法是模拟指针。

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

迭代器的意义,像string、vector支持[]遍历,但是List、map等等容器不支持[],我们就要用迭代器遍历。
3.c++提供,范围for
依次取容器中的数据,赋值给e,自动判断结束。

	for (auto e : s3)
	{
		cout << e << " ";
	}
	cout << endl;

反向迭代器

	string s3("123456");
	string::reverse_iterator rit = s3.rbegin;
	while (rit != s3.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;

在这里插入图片描述

四、尾插

push_back
格式:
void push_back (char c);
Appends character c to the end of the string, increasing its length by one.
插入一个字符到字符串的末尾。

int main()
{
	string s1;
	s1.push_back('h');
	s1.push_back('e');
	s1.push_back('l');
	s1.push_back('l');
	s1.push_back('o');
	return 0;
}

append
string& append (const char* s);
直接插入一个字符串

int main()
{
	string s1;
	s1.push_back('h');
	s1.push_back('e');
	s1.push_back('l');
	s1.push_back('l');
	s1.push_back('o');
	s1.append("world");
	return 0;
}

operator+=
string& operator+= (const string& str);
string& operator+= (const char* s);
string& operator+= (char c);

#include <iostream>
#include <string>

int main ()
{
  std::string name ("John");
  std::string family ("Smith");
  name += " K. ";         // c-string
  name += family;         // string
  name += '\n';           // character

  std::cout << name;
  return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-27 16:01:53  更:2021-07-27 16:03:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/2 3:48:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码