C++ 之string类常用接口功能解析(7千字长文带你玩懂string!)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 之string类常用接口功能解析(7千字长文带你玩懂string!)相关的知识,希望对你有一定的参考价值。

C++ 之string常用接口功能解析

关于string的背景

我们可以看到string的本质就是一个类模板!

**为什么使用的是类模板因为字符串涉及到了编码的问题!——有ACCII ,utf-8 utf-16 utf-32....**为了匹配多个不同的编码的形成的字符串!所以使用了类模板!

utf - 8 是使用了8bit位的编码方式!utf - 16 使用了 16比特位 .....

因为计算机中存储都是使用的是二进制!所以不同的编码方式就使用了不同二进制组合来匹配!不同的字符!

string 对应的就是utf-8 也是应用最广泛的编码方式!utf-8同时也兼容ascii编码!

string的接口解析!

string的构造函数!

string的初始化形式

#include <iostream>
#include<string>
using namespace std;
int main()

	string s1;//创建一个空字符串!——重点

	string s2 = "hello world!";//将一个字符串构造成一个对象!再使用拷贝构造!

	string s3(s2);//拷贝构造

	string s4("helle world");//———重点!
	string s5("hello world", 5);//使用指向这个字符串的,第前n个字符

	string s6(s2, 0, 5);//拷贝s2的子串,从零这个位置开始,往后5个
	string s7(s2, 0, 10000);//如果过长遇到结尾就是停下来!

	string s8(10,a);//使用10个a字符填充这个字符串!——重点!

	return 0;

string的运算符和赋值重载!

+ / = / += / []

int main()

	string s1 = "hello world ";
	string s3 = "no";

	s1 = s1 + a;
	s1 = s1 + "add ";
	s1 = s1 + s3;

	string s2("hello world");
	s2 += "how are you?";

	string s4;
	s4 = s1;

	for (int i = 0; i < s1.size(); i++)
	
		cout << s1[i];//string类型也可以想数组一样正常的使用[],因为[]也是被重载了!
        //支持静态和非静态
	

	return 0;

at

string的迭代器!

我们遍历数组的时候一般都是使用下标[]来完成!string也继承了这个方式!与此同时,也引入了一种全新的变量方式迭代器!

==这里我们必须先明确一个概念!迭代器的行为类似指针!但是不代表迭代器就是指针!==

==迭代器是一种对于容器通用的遍历方式,像是string,vector我们可以使用[]来进行遍历!但是stack或queue就不再支持!但是它们都是支持以迭代器的方式来进行遍历!==

==每一种容器的迭代器的底层实现方式都是不同的!==,==且迭代器的底层也不一定是指针!==

而且迭代器的接口都是相同的!

迭代器的类型

迭代器的类型为 类 :: iterator

	string s1 = "hello world ";
	string::iterator st1 = s1.begin();
//iterator可能是一个类中类,也可能是指针!

begin

返回对象的第一个迭代器!

end

返回对象的最后一个数据的下一个位置的迭代器!

int main()

	string s1 = "1234";
	string::iterator st1 = s1.begin();
	//迭代器的类型是一个类中类!
	//begin接口!是返回这个队形的第一个迭代器!
	while (st1 != s1.end())
	
		*st1 += 1;
		cout << *st1;
		++st1;
	
	return 0;

反向迭代器!

静态迭代器

迭代器总结

string类对象的容量操作

size/lenth

#include<iostream>
#include<string>
using namespace std;
int main()

	string s1 = "hello world";
	cout << s1.size() << endl;
	cout << s1.length() << endl;
	return 0;

capacity

#include<iostream>
#include<string>
using namespace std;
int main()

	string s1 = "hello world";
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	return 0;

empty

int main()

	string s1 = "hello";
	string s2;
	cout << s1.empty() << endl;
	cout << s2.empty() << endl;
	return 0;

clear

int main()

	string s1 = "hello";
	cout << s1.empty() << endl;
	s1.clear();
	cout << s1.empty() << endl;
	return 0;

reserve(重点!)

reserve的意义!

如果我们一开始就知道我们要插入的字符的大小!那么我们就可以一开始就使用这个函数开辟出足够多的空间来避免开辟空间造成的资源浪费!

void TestPushBack()

	string s;
	size_t sz = s.capacity();
	s.reserve(700);
	cout << "making s grow:\\n";
	for (int i = 0; i < 1000; ++i)
	
		s.push_back(c);
		if (sz != s.capacity())
		
			sz = s.capacity();
			cout << "capacity changed: " << sz << \\n;
		
	

int main()

	TestPushBack();
	return 0;

可以看到空间开辟的次数减少了!

resize

int main()

   
   string s1 = "hello wrold";
   cout << "capacity:" << s1.capacity() <<   << "size::" << s1.size() << endl;
   //s1.resize(15);//默认使用\\0进行填充!
   
   s1.resize(15, a);
   cout << "capacity:" << s1.capacity() <<   << "size::" << s1.size() << endl;
   cout << s1 << endl<< endl;
   
   // n > capacity
   s1.resize(100);//当原先的capacity小于n的时候!就会进行扩容!
   cout << "capacity:" << s1.capacity() <<   << "size::" << s1.size() << endl;

   // size <  n <capacity
   s1.resize(15);//当改变的n小于capacity的时候,就不变!
   cout << "capacity:" << s1.capacity() <<   << "size::" << s1.size() << endl;

   // n < size
   s1.resize(1);//当size的值小于原来字符串长度的时候!会将数据进行删除!
   cout << "capacity:" << s1.capacity() <<   << "size::" << s1.size() << endl;
   cout << s1 << endl << endl;
   return 0;


int main()

	string s1 = "hello world";
	s1.reserve(1000);
	cout << "size :" << s1.size() << "capacity :" << s1.capacity() << endl;
	s1.shrink_to_fit();
	cout << "size :" << s1.size() << "capacity :" << s1.capacity() << endl;
	return 0;

string类对象的修改操作

push_back

int main()

	string s1 = "hello world";
	s1.push_back(a);
	s1.push_back(b);
	cout << s1 << endl;
	return 0;

append

assign

insert

int main()

	string s1 = "hello world";
	string s2 = "hello!";

	s1.insert(0, s2);//在 位置0 插入s2
	cout << s1 << endl;
	
	s1.insert(0, s2, 2, 2);//可以调整插入对象的长度和位置!插入s2的2下标开始的长度为2的子串
	cout << s1 << endl;

	s1.insert(0, "new");//在0插入字符串!
	cout << s1 << endl;

	s1.insert(0, 5, a);//在零位置插入5个字符a
	cout << s1 << endl;
	s1.insert(s1.begin(), 5, a);//支持迭代器!
	cout << s1 << endl;
	s1.insert(s1.begin(), a);
	cout << s1 << endl;

	s1.insert(s1.begin(),s2.begin(), s2.begin() + 2);//插入是一个[s2.begin(),s2.begin()+2)的区间!
	cout << s1 << endl;
	return 0;

erase

#include<iostream>
#include<string>
using namespace std;
int main()

	string s1 = "hello world";
	s1.erase(0, 5);//1,从位置0开始,删除5个字符!
    
    //s1.erase(0,10000)//给多了删到结尾就结束!
	cout << s1 << endl;
	s1.erase(s1.begin());//2,支持迭代器
	cout << s1 << endl;

	s1.erase(s1.begin(), s1.begin() + 2);//3,支持迭代器范围!
	cout << s1 << endl;

	return 0;

replace

int main()

	string s1 = "hello world";
	string s2("repalce ");
	s1.replace(0, 1, s2);//从0下标开始,范围是1的区间进行替换![0,1)
	cout << s1 << endl;

	s1.assign("hello world");
	s1.replace(s1.begin(), s1.begin() + 1,s2);//支持迭代器区间!
	cout << s1 << endl;


	s1.assign("hello world");
	s1.replace(0, 5, s2, 0, 5);//也支持对插入的区间进行控制!
	cout << s1 << endl;

	s1.assign("hello world");
	s1.replace(0, 5, "world");//可以直接插入插入字符串!
	cout << s1 << endl;

	s1.assign("hello world");
	s1.replace(0, 5, "world", 3);//可以选择插入前三个!//也支持迭代器范围区间!
	cout << s1 << endl;

	s1.assign("hello world");
	s1.replace(0, 5, 5, a);//前五个都替换成a!//支持迭代器范围区间!
	cout << s1 << endl;
	return 0;

find ——重要!

int main()

	string s1 = "hello world hello world ";
	size_t pos = s1.find( );//找到 就返回  的位置!
	cout << pos << endl;
	pos = s1.find( , pos + 1);//从pos+1这个位置开始找  ,前面忽略!
	cout << pos << endl;

	string s2 = "helle";
	pos = s1.find(s2);//可以用来寻找字串!
	cout << pos << endl;

	pos = s1.find("helle");
	cout << pos << endl;
	if (pos == string::npos)
	
		cout << "npos" << endl;
	
	pos = s1.find("helle", 0, 4);//0是s1的位置! 4是要匹配的字串的长度!
	cout << pos << endl;
	return 0;

rfind

c_str

substr

int main()

	string s1 = "hello world";
	string suffix = s1.substr(0, 5);
	cout << suffix << endl;

	string s2 = "test.txt.zip";
	size_t pos = s2.find(.);
	string suffix2 = s2.substr(pos);
	cout << suffix2 << endl;
	pos = s2.rfind(.);
	string suffix3 = s2.substr(pos);
	cout << suffix3 << endl;
	return 0;

find_first_of

int main()

	string s1 = "hello world hello China hello new world";
	string s2 = "aebch";
	size_t pos = s1.find_first_of(s2);//只要有s2中存在的任意一个字符就算是匹配!
	cout << pos << endl;

	pos = s1.find_first_of(s2,5);//从pos+1的位置开始查找
	cout << pos << endl;

	pos = s1.find_first_of("!", pos + 1);
	if (pos == string::npos)
	
		cout << pos << endl;
	
	return 0;

配合string使用的一些函数

getline

int main()

	string s1;
	getline(cin, s1);
	cout << s1 <<endl;
	return 0;

string支持各种运算符!

标准库中已经为我们重载好了!但是都是按照字符来进行比较的!

以上是关于C++ 之string类常用接口功能解析(7千字长文带你玩懂string!)的主要内容,如果未能解决你的问题,请参考以下文章

c++之构造函数,析构函数(五千字长文详解!)

说说string类

[ C++ ] string类常见接口及其模拟实现

《c++从0到99》七 STL之string类

《c++从0到99》七 STL之string类

《c++从0到99》七 STL之string类