【C++ STL】-- string学习以及常用函数用法总结

目录

1.string有什么用

2. 标准库中的string类

3. 构造

string();

string(const char* s); 

 string(const string& str);

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

string(const char* s, size_t n);

string (size_t n, char c); 

3. 流重载

4. 赋值重载

string& operator = (const string& str);

string& operator = (const char* s);

 string& operator = (char c);

5. 元素访问 -> [ ]重载

6. 迭代器

普通

正向迭代: 

反向迭代: 

const

正向迭代:

反向迭代:

对于cbegin,cend,crbegin,crend

7. 调节

向后追加一个(push_back)

string::push_back

向后追加一个(重载+=) 

向后追加一串或string(append)

string& append (const char* s);

tring& append (const string& str);

string& append (const string& str, size_t subpos, size_t sublen);

string& append (const char* s, size_t n);

string& append (size_t n, char c);

向后追加一串或string(重载+=)

string& operator+= (const string& str);

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

8. 容量

string::size;

string::length

string::max_size

string::capacity

判断是否为空

string::empty

扩容

string::reserve

string::resize

删除

string::clear

string::erase

9. 修改

插入(insert)

string& insert (size_t pos, const string& str);

string& insert (size_t pos, const char* s);

string& insert (size_t pos, size_t n, char c);

string& insert (size_t pos, const char* s, size_t n);


1.string有什么用

         C语言中:字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,而且底层空间需要用户自己管理,导致操作的失误率很高,且不方便。
        C++的string中:大大增强了对字符串的支持,并且可以使用C风格的字符串情况下,还可以使用内置的 string 类,使得对字符串的操作更加便利轻松。
         常规工作中: 为了简单、方便…… 都使用string类

2. 标准库中的string

        string是一个动态增长的char字符数组。

        更多详细看文档:

3. 构造

string();

  • 空字符串构造函数(默认构造函数)
  • 构造一个长度为零个字符的空字符串。
#include<iostream>
#include<string>
void test_string()
{
	string str1;
}

(VS2019实现) 

        原始视图,就是用于看其内部结构是什么样的。 


string(const char* s); 

  • 复制由s指向的以空结尾的字符序列(C字符串)。
#include<iostream>
#include<string>
void test_string()
{
	string str2("hello world");
}

 (VS2019实现)  


 string(const string& str);

  • 拷贝构造
  • 利用str拷贝构造
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
	string str2("hello world");
	string str3(str2);
}

 (VS2019实现) 


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

  • 构造子字符串
  • 复制从字符位置pos开始并跨越len个字符的str部分(如果str短则有多少拷多少或如果len( = string::npos(缺省))大于等于str长度,则复制到str的末尾)。
  • npos意思是“直到字符串结束”。

        -1转换为无符号数整数,即为最大的无符号整数(40亿多 -> 4G) 。所以因为size_t len的缺省值为最大的无符号整数,当不传参数时,是与传递长度大于str长度一样的。

#include<iostream>
#include<string>
using namespace std;

void test_string()
{
	string str2("hello world");
	string str4(str2, 6, 3);
}

 (VS2019实现) 

        如果str短则有多少拷多少或如果len( = string::npos(缺省))大于等于str长度,则复制到str的末尾。


string(const char* s, size_t n);

  • 从缓冲器
  • 从s指向的字符数组中复制前n个字符。
#include<iostream>
#include<string>
using namespace std;

void test_string()
{
	string str5("hello world", 7);
}

 (VS2019实现) 


string (size_t n, char c); 

  • 填充构造
  • 用字符c的n个连续填充字符串。
#include<iostream>
#include<string>
using namespace std;

void test_string()
{
	string str6("a", 10);
}

  (VS2019实现) 

3. 流重载

  • 此函数重载运算符<<,使其行为与c++字符串的istream::operator>>中所述相同,但应用于string类型的对象

        使得输出更加便利:

#include<iostream>
#include<string>
using namespace std;
void test_string()
{
	string str1;
	string str2("hello world");
	cout << str1 << endl;
	cout << str2 << endl;
}

(VS2019实现)  


  • 此函数重载运算符>>,使其行为与c字符串的istream::operator>>中所述相同,但应用于string类型的对象 

        使得输入更加便利: 

#include<iostream>
#include<string>
using namespace std;
void test_string()
{
	string str1;
	string str2("hello world");
	cin >> str1 >> str2;
}

4. 赋值重载

(赋值是直接进行覆盖)

string& operator = (const string& str);

#include<iostream>
#include<string>
using namespace std;

void test_string()
{
	string str1;
	string str2("hello world");

	str1 = str2;
}

(VS2019实现)  


string& operator = (const char* s);

#include<iostream>
#include<string>
using namespace std;
void test_string()
{
	string str2("hello world");

	str2 = "xx";
}

(VS2019实现)  


 string& operator = (char c);

#include<iostream>
#include<string>
using namespace std;
void test_string()
{
	string str2("hello world");

	str2 = 'a';
}

(VS2019实现)  


5. 元素访问 -> [ ]重载

        使得对字符串的访问可以像数组一样。

#include<iostream>
#include<string>
using namespace std;
void test_string()
{
	string str1("hello world");
	cout << str1[0] << endl;
	str1[0] = 'x';
	cout << str1[0] << endl;
	str1[0]++;
	cout << str1[0] << endl;

    //const
    const string str2("hello world"); //只能访问不能修改
}

(VS2019实现)  

        对于自定义类型,是不能直接使用运算符的,所以在对运算符的调用上需要转换,使得运算符重载。


6. 迭代器

普通

        迭代器是所有容器通用的访问方式。

        迭代器在string中是一个指针一样的东西,是一个在string这个类里面的一个内嵌类型(里面dypedef的或其里面定义的内部类)。

正向迭代: 

string::begin 

  • 返回指向字符串第一个字符的迭代器。

string::end

  • 返回一个迭代器,该迭代器指向超过字符串的结束字符。

        begin是第一个元素的位置,end是最后一个元素的下一个元素的位置。所以,其是一个左闭右开的区间

#include<iostream>
#include<string>
using namespace std;
void test_string()
{
	string str("hello");
	string::iterator it = str.begin();
	while (it != str.end())
	{
		cout << *it;
		++it;
	}
	cout << endl;
}

 

 补充:范围for

#include<iostream>
#include<string>
using namespace std;
void test_string()
{
	string str("hello");
	string::iterator it = str.begin();
    
    // 范围for -- 自动迭代,自动判断结束
	// 依次取s中每个字符,赋值给ch
	for (auto& ch : str)
	{
		ch++;
		cout << ch;
	}
}	

        范围for底层就是迭代器,当范围for执行时就会替换成之前的迭代器代码。

(VS2019实现) 


反向迭代: 

string::rbegin

  • 返回反向迭代器以反向开始

string::rend

  • 返回一个反向迭代器,该迭代器指向字符串第一个字符(被视为其反向端)前面的一个元素。

-rbegin是最后一个元素的位置,rend是的第一个元素上一个元素的位置。所以,其是一个左闭右开的区间

#include<iostream>
#include<string>
using namespace std;
void test_string()
{
	string str("hello");
	string::reverse_iterator rit = str.rbegin();
	while (rit != str.rend())
	{
		cout << *rit;
		++rit;
	}
	cout << endl;
}

(VS2019实现)

const

        例如,需要写一个输出函数,由于需要将const string&类型的形参进行接收。

正向迭代:

#include<iostream>
#include<string>
using namespace std;
void Print_string(const string& str)
{
	string str("hello");
	string::const_iterator it = str.begin();
	while (it != str.end())
	{
		cout << *it;
		++it;
	}
	cout << endl;
}

反向迭代:

#include<iostream>
#include<string>
using namespace std;
void Print_string(const string& str)
{
	string::const_reverse_iterator rit = str.rbegin();
	while (rit != str.rend())
	{
		cout << *rit;
		++rit;
	}
	cout << endl;
}

对于cbegin,cend,crbegin,crend

        此主要是c11针对于曾经的不规范,由于以前普通与const都是使用begin,end,rbegin,rend,所以为了规范出了cbegin,cend,crbegin,crend,(由于曾经的规范也不能更改,所以可以用也可以不用)。

7. 调节

向后追加一个(push_back)

string::push_back

  • 将字符c追加到字符串的末尾,将其长度增加1。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
	string str("Hello ");
	str.push_back('-');
	cout << str << endl;
}

(VS2019实现)  


向后追加一个(重载+=) 

#include<iostream>
#include<string>
using namespace std;
void test_string()
{
	string str("hello");
	str += 'x';
	cout << str << endl;
}

(VS2019实现)  


向后追加一串或string(append)

string& append (const char* s);

  • 追加由s指向的以空结尾的字符序列(C字符串)形成的字符串的副本。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
	string str("Hello ");
	str.append("world");
	cout << str << endl;
}

(VS2019实现)  


tring& append (const string& str);

  • 追加str的副本。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
	string str1;
	string str2("hello world");
	str1.append(str2);
	cout << str1 << endl;
}

(VS2019实现) 


string& append (const string& str, size_t subpos, size_t sublen);

  • 追加str子字符串的副本。该子字符串是str中从字符位置子字符串开始并跨越子字符串字符的部分(或者,如果str短则有多少追加多少或如果长度大于等于str长度,则直到str结束)。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
	string str1;
	string str2("hello world");
	str1.append(str2, 0, 20);
	cout << str1 << endl;
}

(VS2019实现)  


string& append (const char* s, size_t n);

  • 在由s指向的字符数组中追加前n个字符的副本。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
	string str("hello");
	str.append("worldxxxxx", 5);
	cout << str << endl;
}

(VS2019实现)  


string& append (size_t n, char c);

  • 追加字符c的n个连续副本。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
	string str("hello");
	str.append(10, 'x');
	cout << str << endl;
}

(VS2019实现)  


向后追加一串或string(重载+=)

string& operator+= (const string& str);

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

  • 通过在字符串的当前值末尾附加其他字符来扩展字符串。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
	//string& operator+= (const string& str);
	string str1("hello");
	string str2("world");
	str1 += str2;
	cout << str1 << endl;

	//string& operator+= (const char* s);
	string str("hello");
	str += "world";
	cout << str << endl;
}

(VS2019实现) 


8. 容量

string::size;

string::length

  • 返回字符串的长度,以字节为单位。

string::max_size

string::capacity

  • max_size:返回字符串可以达到的最大长度。
  • capacity:返回当前为字符串分配的存储空间大小,以字节表示。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
	string str("hello world");
	cout << str.length() << endl;
	cout << str.size() << endl;
	cout << str.max_size() << endl;
	cout << str.capacity() << endl;
}

(VS2019实现) 


判断是否为空

string::empty

  • 返回字符串是否为空(即其长度是否为0)。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
	string str1;
	string str2("hello world");
	cout << str1.empty() << endl; //空返回1
	cout << str2.empty() << endl; //有返回0
}

(VS2019实现) 


扩容

string::reserve

  • 请求对字符串容量进行调整,以适应最大长度为n个字符的计划大小变化。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
	string str;
	str.reserve(200); //开空间
	cout << str.capacity() << endl;
	cout << str.size() << endl;
}

(VS2019实现) 

string::resize

#include<iostream>
#include<string>
using namespace std;
void test_string()
{
	string str;
	str.resize(200);     //开空间 + 初始化
	cout << str.capacity() << endl;
	cout << str.size() << endl;
}

 (VS2019实现) 


删除

string::clear

  • 擦除字符串的内容,该字符串将变为空字符串(长度为0个字符)。
#include<iostream>
#include<string>
using namespace std;
void test_string()
{
	string str("hello world");
	str.clear();
}

(VS2019实现) 

string::erase

  • 删除部分字符串,减少其长度。
  • 擦除字符串值中从字符位置pos开始并跨越len个字符的部分(如果str短则有多少删多少或如果len( = string::npos(缺省))大于等于str长度,则删除到字符串末尾)。
  • Note:默认参数会删除字符串中的所有字符。

9. 修改

插入(insert)

string& insert (size_t pos, const string& str);

  • 插入str的副本。
  • 新内容插入到位置pos处的字符之前。
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s1("hello");
	string s2("world");
	s1.insert(0, s2);
	return 0;
}


string& insert (size_t pos, const char* s);

  • 插入由s指向的以空结尾的字符序列(C字符串)形成的字符串的副本。
  • 新内容插入到位置pos处的字符之前。
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("hello");
	s.insert(0, "xxx");
	return 0;
}


string& insert (size_t pos, size_t n, char c);

  • 插入字符c的n个连续副本。
  • 新内容插入到位置pos处的字符之前。
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("hello");
	s.insert(0, 10, 'x');
	return 0;
}


string& insert (size_t pos, const char* s, size_t n);

  • 在由s指向的字符数组中插入前n个字符的副本。
  • 新内容插入到位置pos处的字符之前。
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s("hello");
	s.insert(0, "xxxxxxxxxxx", 2);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

川入

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值