一起来看看C++STL容器之string类

目录
  • 前言
  • 1.标准库中的string类
  • 2.string类的常用接口说明
    • 2.1string对象的常见构造
    • 2.2string类对象的容量操作
      • 2.2.1reserve是如何开辟空间的
      • 2.2.2clear和empty
      • 2.2.3resize的用法
    • 2.3string类对象的访问以及遍历操作
      • 范围for的使用
    • 2.4string类对象的修改操作
      • 2.4.1push_back和append以及operator+=
      • 2.4.2 find和rfind以及substr
    • 2.5string非成员函数重载
  • 总结

前言

为什么学习string类:

在C语言中,字符串是以'\0'结尾的集合,为了操作方便,在C标准库中提供一些str系列的函数(strstr,strcmp,strcpy……),但是这些库函数和字符串时分离的,不太符合oop的思想。稍不留神就会造成越界访问。

在OJ题中,有关字符串的题目基本以string的形式出现,而且在常规的工作中,为了简单,方便,快捷,基本都是使用string类,很少有人会使用C库中的字符串操作函数。

1.标准库中的string类

1.string类是表示字符串的字符种类。

2.该类的接口与常规容器的接口基本相同,在添加一些专门用来操作string的常规操作。

3.string的底层是:basic_string模板类的别名。

4.不能操作多字节或者变长字符的序列。

在使用string的时候,必需包含头文件#include<string>以及using namespace std;

2.string类的常用接口说明

2.1 string对象的常见构造

string() 构造空的string类对象
string(const char* str) 以常量字符创为参数构造string类
string(size_t n,char ch) string对象中包含了n个字符c
string(const string& s)
拷贝构造函数

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1;
	string s2("CSDN");
	string s3(4, 'A');
	string s4(s2);
	cout << s1 << endl;
	cout << s2 << endl;
	cout << s3 << endl;
	cout << s4 << endl;
}

[点击并拖拽以移动]
​

 运行结果:

2.2 string类对象的容量操作

size 返回字符串的有效长度
length 和size一致,推荐使用size
capacity 返回总空间大小
clear 清空有效字符,但是不对capacity有影响
reserve 为字符串预留空间
empty 判断字符串是否为空串,返回值为bool
resize
将有效字符的个数该成n个,多出的空间用字符c填充

2.2.1 reserve是如何开辟空间的

void reserve (size_t n=0)

void TestPushBack()
{
	string s;
	size_t sz = s.capacity();
	for (int i = 0; i < 1000; ++i)
	{
		s.push_back('c');
		if (sz != s.capacity())//当sz和_capacity不相等的时候,说明reserve已经增容了。
		{
			static int n = 1;
			sz = s.capacity();
			printf("第%d次开辟空间:_capacity=%d\n", n++, sz);
		}
	}
}

运行结果:

说明在VS的环境下,reserve每次开辟的空间是前一次空间的约1.5倍。

2.2.2 clear 和 empty

void clear ()

bool empty() const

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1("CSDN");
	cout << s1.capacity() << endl;
	cout << s1.empty() << endl;
	s1.clear();
	cout << s1.capacity() << endl;
	cout << s1.empty() << endl;
}

运行结果:

说明了clear只会清理有效的字符串,不会对空间的大小有影响,当clear后,empty的返回值为0,说明了此时的是s1是空字符串。

2.2.3 resize的用法

void resize(size_t n)

void resize(size_t n,char ch)

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1("CSDN");
	s1.resize(10, 'A');//输出的是------>CSDNAAAAAAAA
	cout <<s1<< endl;
}

2.3 string类对象的访问以及遍历操作

operator[ ]
返回 pos 位置的字符, const string 类对象调用
begin+end
begin 获取一个字符的迭代器 + end 获取最后一个字符下一个位置的迭代器 (正向迭代器)
rbegin+rend
begin 获取一个字符的迭代器 + end 获取最后一个字符下一个位置的迭代器 (反向迭代器)
范围for C++11支持的更简洁的遍历方式

const_iterator begin()const

iterator begin()

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1("hello CSDN");
	auto it1= s1.begin();//正向迭代器
	while (it1 != s1.end())//end指向的是最后一个元素的下一位
	{
		cout << *it1 << " ";
		it1++;
	}
	cout << endl;
	auto it2 = s1.rbegin();//反向迭代器
	while (it2 != s1.rend())
	{
		cout << *it2 << " ";
		it2++;
	}
}

运行结果:

范围for的使用

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1("hello CSDN");
	for (auto ch :s1)
		cout << ch<< " ";
}

本质上,范围for调用的是迭代器。

2.4 string类对象的修改操作

push_back 尾插字符ch
append 尾插字符串str
operator+= 尾插字符ch/尾插字符串
c_str 返回C格式字符串
find+npos
从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置,npos是size_t的最大值
rfind
从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr
在str中从pos位置开始,截取n个字符,然后将其返回

2.4.1 push_back 和 append 以及operator+=

void push_back(char ch)

string& append(const char* str)

string& operator+=(char ch)

string& operator+=(const char* str)

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1("hello ");
	s1.push_back('C');
	s1.append("SDN");
	cout << s1 << endl;
	string s2("hello ");
	s2 += 'w';
	s2 += "orld";
	cout << s2 << endl;
}

运行结果:

operator +=可以尾插字符,也可以尾插字符串。实际上,operator +=尾插字符的时候,调用的是push_back,尾插字符串的时候,调用的是append。

2.4.2  find 和 rfind 以及 substr

size_t find(char c,size_t pos=0) const

size_t rfind(char c,size_t pos=npos)

string substr(size_t pos=0,size_t len=npos)

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1("hello CSDN");
	cout << s1.find('C') << endl;
	cout << s1.rfind('C',0) << endl;//从pos=0处,即字符'h'往前找,找不到字符'C'返回的是npos
	                                //npos是size_t中的最大值--->4294967295
	cout << s1.rfind('C', 8) << endl;
	cout << s1.substr(2, 3) << endl;//从字符串的第二个位置开始,截取len=3个字符
}

运行结果:

2.5 string非成员函数重载

operator+ 尽量少用,因为传值返回,导致深拷贝效率低
operator<< 输出运算符重载
operator>> 输出运算符重载
getline 获取一行字符串
relational operator 大小比较

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • c++模拟实现string类详情

    目录 一.string类简介 二.模拟实现 成员变量 成员函数 迭代器 重载运算符[ ] 三.几种常见函数 reserve() resize() push_back() append() 重载+= insert() erase() find() 四.操作符重载 流插入<< 流提取>> 一.string类简介 标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件.作为标准库的一部分,string定义在命名空间std中. 二.模拟实现 成员变量

  • C++ 系统String类详解

    目录 一.C++ 系统String类 1.定义及初始化 2.类型大小 3.常用运算 1.赋值 2.加法 3.关系 4.常见的成员函数 1.下标操作 2.求串大小 3.返回c串(c语言中的字符串也叫c串) 4.查找 5.删除 6.交换swap 5.string类型数组 总结 一.C++ 系统String类 除了使用字符数组来处理字符串以外,c++引入了字符串类型.可以定义字符串变量. 1.定义及初始化 #include <iostream> #include <string.h> u

  • 深入解析C++ STL中的常用容器

    STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们大家使用.下面,我们就浅谈某些常用的容器.这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点.STL中的常用容器包括:顺序性容器(vector.deque.list).关联容器(map.set).容器适配器(queue.stac). 1.顺序性容器 (1)vectorvector是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问.由于具有连续的存储空间,所以在插入和删除操作方面,效率比较慢

  • C++语言 STL容器list总结

    在使用std::list<>链表时,难免会对数据进行添加删除操作.而遍历链表则有两种方式:通过索引访问,象数组一样处理:通过std::list<>::iterator链表遍历器进行访问 STL 中的list 就是一 双向链表,可高效地进行插入删除元素. list不支持随机访问.所以没有 at(pos)和operator[]. list 对象list1, list2 分别有元素list1(1,2,3),list2(4,5,6) .list< int>::iterator

  • C++实现STL容器的示例

    各大容器的特点: 1.可以用下标访问的容器有(既可以插入也可以赋值):vector.deque.map: 特别要注意一下,vector和deque如果没有预先指定大小,是不能用下标法插入元素的! 2. 序列式容器才可以在容器初始化的时候制定大小,关联式容器不行: 3.注意,关联容器的迭代器不支持it+n操作,仅支持it++操作. 适配器的概念 适配器的意思就是将某些已经存在的东西进行限制或者组合变成一个新的东西,这个新的东西体现一些新的特性,但底层都是由一些已经存在的东西实现的. STL中的容器

  • C++中的string类型

    目录 1.string 类 1.1 和char *的异同 1.2 C++11初始化 1.3 拼接 1.4 长度 1.5 IO 1.6 原始字符串 1.string 类 1.1 和char *的异同 在C++当中,除了char *类型,还有专门的字符串类型,就叫做string. 通过包含头文件string就可以使用: include<string> 在很多方面,string类型的使用方法和char *一样,例如: string str1; string str2 = "hello wo

  • C++ STL中的容器适配器实现

    1 stack 1.1 stack 介绍 stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:empty:判空操作.back:获取尾部元素操作.pus

  • 浅谈C++STL之双端队列容器

    概述 deque块在头部和尾部都可以插入和删除.而不需要移动任何元素,而不需要移动其他元素(使用push_back()方法在尾部插入元素,会扩张队列,而使用push_front()方法在首部插入元素和使用insert()方法在中间插入元素,只是将原位置上的元素进行覆盖,不会增加新元素)一般来说,当考虑到容器元素的内存分配策略和操作的性能时deque相当于vector更有优势. 创建deque对象与vector类似 插入元素 使用push_back()方法从尾部插入元素,会不断扩张队列. #inc

  • 一起来看看C++STL容器之string类

    目录 前言 1.标准库中的string类 2.string类的常用接口说明 2.1string对象的常见构造 2.2string类对象的容量操作 2.2.1reserve是如何开辟空间的 2.2.2clear和empty 2.2.3resize的用法 2.3string类对象的访问以及遍历操作 范围for的使用 2.4string类对象的修改操作 2.4.1push_back和append以及operator+= 2.4.2 find和rfind以及substr 2.5string非成员函数重载

  • STL 的string类怎么啦

    STL 的string类怎么啦?陈皓 前言 上个周末在和我的同学爬香山闲聊时,同学说到STL中的string类曾经让他备受折磨,几年前他开发一个系统前对string类还比较清楚,然后随着程序的复杂度的加深,到了后期,他几乎对string类失去了信心和信任,他觉得他对string类一头雾水.老实说,我几年前也有同样的痛苦(就是当我写下<标准C++类string的Copy-On-Write技术>之前的一段时间).那时,我不得不研究那根本不是给人看的SGI出品的string类的源码,代码的可读性几乎

  • c++ STL库容器之集合set代码实例

    set 简介 set是STL中一种标准关联容器,其键值就是实值,实值就是键值,不可以有重复,所以我们不能通过set的迭代器来改变set的元素的值.它底层使用平衡的搜索树--红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高.set,顾名思义是"集合"的意思,在set中元素都是唯一的,而且默认情况下会对元素自动进行升序排列,支持集合的交(set_intersection),差(set_difference) 并(set_union),对称差(s

  • 关于C++STL string类的介绍及模拟实现

    目录 一.标准库中的string类 1.string类 2.string类中的常用接口说明+模拟实现 2.1 string类对象的常见构造+模拟实现 2.2 string类对象的容量操作+模拟实现 2.3 string类对象的访问及遍历操作+模拟实现 2.4 string类对象的修改操作+模拟实现 2.5 string类非成员函数+模拟实现 一.标准库中的string类 1.string类 字符串的表示字符序列的类 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专

  • C++STL之string类的使用

    目录 1.STL简介 (1)什么是STL (2)STL的版本 (3)如何学习STL (4)STL的六大组件 2.string类的基本概念 (1)含义 (2)使用方法 (3)原理 3.string类中常见构造函数 4.string类中析构函数 5.string类对象的容量操作 (1)显示容量 (2)扩容 6.string类中operator[]重载 (1)举例 (2)底层实现 7.string类与迭代器 (1)举例 (2)反向迭代器 (3)使用迭代的意义 (4)补充:语法糖实现遍历 8.strin

  • STL中的string你了解吗

    目录 模拟实现一个string类 成员变量 构造函数 遍历 与容量相关的成员函数 运算符的重载 修改器 常用的几个字符串函数 总结 STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架. STL的六大组件:容器.迭代器.适配器.空间配置器.仿函数.算法. string的行为与普通容器类似,但是并不能说它是个容器,因为无法接受所有类型的数据. string是表示字符串的字符串类. s

  • 分享C++面试中string类的一种正确写法

    具体来说: 能像 int 类型那样定义变量,并且支持赋值.复制. 能用作函数的参数类型及返回类型. 能用作标准库容器的元素类型,即 vector/list/deque 的 value_type.(用作 std::map 的 key_type 是更进一步的要求,本文从略). 换言之,你的 String 能让以下代码编译运行通过,并且没有内存方面的错误. 复制代码 代码如下: void foo(String x)  {  } void bar(const String& x)  {  } Strin

  • 探究C++中string类的实现原理以及扩展使用

    C++程序员编码过程中经常会使用string(wstring)类,你是否思考过它的内部实现细节.比如这个类的迭代器是如何实现的?对象占多少字节的内存空间?内部有没有虚函数?内存是如何分配的?构造和析构的成本有多大?笔者综合这两天阅读的源代码及个人理解简要介绍之,错误的地方望读者指出. 首先看看string和wstring类的定义: typedef basic_string<char, char_traits<char>, allocator<char> > string

  • 代码分析c++中string类

    一:回顾 (1)c++中的string类是在面试中和笔试中经常考的题目: 工程代码免费下载 string类的自行实现 (2)c++中的string类和fstream类合起来是处理外部数据的利器: (3)string类经常用到find find_first_of find_first_not_of find_last_of find_last_not_of substr replace等,以及联合使用来达到java中的split和trim (4) 使用friend 仅仅是在类中进行声明的非内部 却

  • C++中的string类(C++字符串)入门完全攻略

    前言 string 类是 STL 中 basic_string 模板实例化得到的模板类.其定义如下: typedef basic_string <char> string; basic_string 此处可以不必深究. string 类的成员函数有很多,同一个名字的函数也常会有五六个重载的版本.篇幅所限,不能将这些原型一一列出并加以解释.这里仅对常用成员函数按功能进行分类,并直接给出应用的例子,通过例子,读者可以基本掌握这些成员函数的用法. 要想更深入地了解 string 类,还要阅读 C++

随机推荐