STL容器与算法(二)C++ string类知识点

C++ string类知识点

string 类是 STL 中 basic_string 模板实例化得到的模板类。

定义如下:typedef basic_string <char> string;

在这里插入图片描述
string类的函数种类有很多,不能一一列出并加以解释,一下举出一些常用的种类。


头文件

#include<iostream>
#include<string>
using namespace std;
  • 注意是string与string.h不同,前者是类的头文件,后者则是C语言中字符串操作的头文件。
  • 而且#inculde<string>一定要与using namespace std;一起使用,后者是打开标准命名空间。

构造函数

语法:

string();
string( size_type length, char ch );
string( const char *str ); //字符串初始化
string( const char *str, size_type length ); //str的前面几个
string( string &str, size_type index, size_type length ); //中间几个
string( input_iterator start, input_iterator end );
srting(const string& str); //拷贝构造

字符串的构造函数创造一个新字符串,包括:

  • 以length为长度的ch的拷贝(即length个ch)
  • 以str为初值(长度任意)
  • 以index为索引开始的子串,长度为length,或者
  • 以从start到end的元素为初值
  • 直接拷贝str.

例如,

	string str;                   //空字符串	
	string str1( 5, 'a' );        // 5个a 
    string str2( "123456789" );   // str2为123456789 
    string str3( "123456789", 4 );//前4个初始化给str3 
	string str4( str2, 0, 4);     //从第0个开始取4个字符初始化给str4 
	string str5( str4);            //拷贝str4 
	
	cout << str << endl;
    cout << str1 << endl;
    cout << str2 << endl;
    cout << str3 << endl;
    cout << str4 << endl; 
	cout << str5 << endl;

输出结果为:
在这里插入图片描述

属性

  • empty()

语法:

bool empty();

  • 若字符串为空,返回真
  • end()函数返回一个迭代器,指向字符串的末尾(最后一个字符的下一个位置).
string str();
strint str2("123456789");

cout << str2.empty() << endl;
cout << str.empty() << endl;

运行结果如下:
在这里插入图片描述

  • capacity()

语法:

size_type capacity();

  • 返回重新分配空间前的字符容量
  • capacity()函数返回在重新申请更多的空间前字符串可以容纳的字符数. 这个数字至少与 size()一样大.
	string str;  //空字符串	
	string str1( 5, 'a' );
    string str2( "123456789" );
    
    cout << str.capacity() << endl;
	cout << str1.capacity() << endl;
	cout << str2.capacity() << endl;

运行结果如下:
在这里插入图片描述

  • reserve()

语法:

void reserve( size_type num );

  • 保留一定容量以容纳字符串(设置capacity值)
  • reserve()函数设置本字符串的capacity 以保留num个字符空间。
	string str;  //空字符串	
	string str1( 5, 'a' );
	
	cout << str.capacity() << endl;//返回字符容量
	cout << str1.capacity() << endl;
	
	str.reserve(20);//将str的容量定为20
	str1.reserve(20);//将str1的容量定位20
	
	cout << str.capacity() << endl;
	cout << str1.capacity() << endl;

运行结果如下:
在这里插入图片描述

  • length()

语法:

size_type length();

  • 返回字符串的长度
  • length()函数返回字符串的长度. 这个数字应该和size()返回的数字相同.
	string str;  //空字符串	
	string str1( 5, 'a' );
    string str2( "123456789" );
    
	cout << str.length() << endl;
	cout << str1.length() << endl;
	cout << str2.length() << endl;

运行结果如下:
在这里插入图片描述

  • size()

语法:

size_type size();

  • 返回字符串中字符的数量
  • size()函数返回字符串中现在拥有的字符数。
	string str;  //空字符串	
	string str1( 5, 'a' );
    string str2( "123456789" );
    
    cout << str.size() << endl;
	cout << str1.size() << endl;
	cout << str2.size() << endl;   

运行结果如下:
在这里插入图片描述

  • resize()

语法:

void resize( size_type num );
void resize( size_type num, char ch );

  • 重新设置字符串的大小
  • resize()函数改变本字符串的大小到num, 新空间的内容不确定。也可以指定用ch填充。
    string str2( "123456789" );
    str2.resize(5);
    
	cout << str2 << endl;
	cout << str2.size() << endl;

运行结果如下:
在这里插入图片描述


输出

因为cout重载了string类库中的string类型,所以C++中可以用cout直接输出sting类型。

  • 直接输出cout
	string str2( "123456789" );
	cout << str2 << endl;

输出结果为:123456789

  • c_str()

语法:

const char *c_str();

  • 将字符串以C字符数组的形式返回
  • c_str()函数返回一个指向正规C字符串的指针, 内容与本字符串相同.
	string str2( "123456789" );
	cout << str2.c_str() << endl;

输出结果为:123456789

  • 下标输出
	string str2( "123456789" );
	cout << str2[1] << endl; 
	//通过下标运算输出指定元素,注意不可以越界,越界会崩溃

输出结果为:
在这里插入图片描述

  • at()

语法:

reference at( size_type index );

  • 按给定索引值返回字符
  • at()函数返回一个引用,指向在index位置的字符. 如果index不在字符串范围内, at() 将报告"out of range"错误,并抛出out_of_range异常。 越界就会崩溃
	string str2( "123456789" );
	cout << str2.at(1) << endl;

输出结果为:
在这里插入图片描述


修改

  • 通过下标修改
	string str2( "123456789" );	
	str2[2] = 'M';
	
	cout << str2 << endl; 

运行结果:
在这里插入图片描述

  • at()

	string str2( "123456789" );	
	str2.at(2) = 'M';
	
	cout << str2 << endl; 

运行结果:
在这里插入图片描述


插入

  • insert()

语法:

iterator insert( iterator i, const char &ch );
basic_string &insert( size_type index, const basic_string &str );
basic_string &insert( size_type index, const char *str );
basic_string &insert( size_type index1, const basic_string &str, size_type index2, size_type num );
basic_string &insert( size_type index, const char *str, size_type num );
basic_string &insert( size_type index, size_type num, char ch );
void insert( iterator i, size_type num, const char &ch );
void insert( iterator i, iterator start, iterator end );

  • 插入字符
  • insert()函数的功能非常多:
    • 在迭代器i表示的位置前面插入一个字符ch,
    • 在字符串的位置index插入字符串str,
    • 在字符串的位置index插入字符串str的子串(从index2开始,长num个字符),
    • 在字符串的位置index插入字符串str的num个字符,
    • 在字符串的位置index插入num个字符ch的拷贝,
    • 在迭代器i表示的位置前面插入num个字符ch的拷贝,
    • 在迭代器i表示的位置前面插入一段字符,从start开始,以end结束.
	string str1( "MH");
	string str2( "123456789" );
	
	str2.insert( 2, "M");//在下表为 2的字符前面插入M 
	cout << str2 << endl;
		
	str2.insert( 4, str1);//在下标为 4的字符前面插入str1  
	cout << str2 << endl;
	
	str2.insert( 7, str1, 0, 1);//在下标为 7的字符前插入str1的第 0~1个字符
	cout << str2 << endl;
	
	str2.insert( 8, 1, 'H');//下标为 8的字符前插入 1个 'H' 
	cout << str2 << endl;

输出结果:
在这里插入图片描述

  • append()

语法:

basic_string &append( const basic_string &str );
basic_string &append( const char *str );
basic_string &append( const basic_string &str, size_type index, size_type len );
basic_string &append( const char *str, size_type num );
basic_string &append( size_type num, char ch );
basic_string &append( input_iterator start, input_iterator end );

  • 在字符串的末尾添加文本
  • append() 函数可以完成以下工作:
    • 在字符串的末尾添加str,
    • 在字符串的末尾添加str的子串,子串以index索引开始,长度为len
    • 在字符串的末尾添加str中的num个字符,
    • 在字符串的末尾添加num个字符ch,
    • 在字符串的末尾添加以迭代器start和end表示的字符序列.
	string str3("MH");  
	string str4("123");

	str3 +=str4;//在str3尾巴加str4 
	cout << str3 << endl;
	
	str3 +="MH";//在str3后加MH 
	cout << str3 << endl;
	
	str3.append(str4);//在str3尾巴加str4
	cout << str3 << endl;
	
	str3.append("MH");//在str3后加MH
	cout << str3 << endl;
	
	str3.append("ABCD",3);//在str3后加字符串的耆前三个 
	cout << str3 << endl; 

输出结果:
在这里插入图片描述


赋值

  • = 赋值
	string str1("1234");
	string str2("1");
	cout << str1 << endl;
	str2 = str1;
	cout << str2 << endl;

输出结果:
在这里插入图片描述

  • cin<< 输入
	string str3;
	cout << "请输入:"<< endl;
	cin >> str3;
	cout << str3 << endl;

输出结果:
在这里插入图片描述

  • assign()

语法:

basic_string &assign( const basic_string &str );
basic_string &assign( const char *str );
basic_string &assign( const char *str, size_type num );
basic_string &assign( const basic_string &str, size_type index, size_type len );
basic_string &assign( size_type num, char ch );

  • 为字符串赋新
  • assign()函数以下列方式赋值:
    • 用str为字符串赋值,
    • 用str的开始num个字符为字符串赋值,
    • 用str的子串为字符串赋值,子串以index索引开始,长度为len
    • 用num个字符ch为字符串赋值.
	string str4;
	str4.assign( str1);//将str1赋值给str4 
	cout << str4 << endl;
	
	str4.assign("asd", 2);//取前两个字符作为str4 
	cout << str4 << endl;
	
	str4.assign( str1, 0,2);//取str1的0~2作为str4的值 
	cout << str4 << endl;
	
	str4.assign( 3, 'g' );//三个g作为str4的值 
	cout << str4 << endl;

输出结果:
在这里插入图片描述

  • erase()

语法:

iterator erase( iterator pos );
iterator erase( iterator start, iterator end );
basic_string &erase( size_type index = 0, size_type num = npos );

  • 删除字符
  • erase()函数可以:
    • 删除pos指向的字符, 返回指向下一个字符的迭代器,
    • 删除从start到end的所有字符, 返回一个迭代器,指向被删除的最后一个字符的下一个位置
    • 删除从index索引开始的num个字符, 返回*this.

操作函数

  • compare()比较

语法:

int compare( const basic_string &str );
int compare( const char *str );
int compare( size_type index, size_type length, const basic_string &str );
int compare( size_type index, size_type length, const basic_string &str, size_type index2,
size_type length2 );
int compare( size_type index, size_type length, const char *str, size_type length2 );

  • compare()函数以多种方式比较本字符串和str,返回:

    在这里插入图片描述

  • 比较两个字符串

  • 不同的函数:

    • 比较自己和str,
    • 比较自己的子串和str,子串以index索引开始,长度为length
    • 比较自己的子串和str的子串,其中index2和length2引用str,index和length引用自己
    • 比较自己的子串和str的子串,其中str的子串以索引0开始,长度为length2,自己的子串以index开始,长度为length
	string str1("12345");
	string str2("123");
	cout << (str1 > str2) << endl;
	cout << (str1 < str2) << endl;
	cout << str1.compare(str2) << endl;
	cout << str1.compare(0,3,str2) << endl;
	cout << str1.compare(0,2, str2,0,2) <<endl

输出结果:
在这里插入图片描述

  • 拷贝copy()

语法:

size_type copy( char *str, size_type num, size_type index );

  • 将内容复制为一个字符数组
  • copy()函数拷贝自己的num个字符到str中(从索引index开始)。返回值是拷贝的字符数
	string str1("12345");
	char arr[10];
	str1.copy(arr, 3,0);
	//将str1从第0个开始复制三个字符为arr 
	cout << arr << endl

输出结果:
在这里插入图片描述

  • find()

语法:

size_type find( const basic_string &str, size_type index );
size_type find( const char *str, size_type index );
size_type find( const char *str, size_type index, size_type length );
size_type find( char ch, size_type index );

  • 在字符串中查找字符

  • find()函数:

    • 返回str在字符串中第一次出现的位置(从index开始查找)。如果没找到则返回string::npos,
    • 返回str在字符串中第一次出现的位置(从index开始查找,长度为length)。如果没找到就返回string::npos,
    • 返回字符ch在字符串中第一次出现的位置(从index开始查找)。如果没找到就返回string::npos
	string str1("12345");
	string str2("123");
	cout << (int)str1.find(str2) << endl;
	//若找到,返回在str1找到子串str2的第一个字符的下标;若没有则返回 
	cout << (int)str1.find("1") << endl;//返回第一个找的下标 
	cout << (int)str1.find("2",1,0) << endl;//查找2在str1的下标
	cout << (int)str1.find("3",0)  << endl; //从下标为0开始找查 

输出结果:
在这里插入图片描述

  • substr()

语法:

basic_string substr( size_type index, size_type num = npos );

  • 返回某个子字符串
  • substr()返回本字符串的一个子串,从index开始,长num个字符。如果没有指定,将是默认值 string::npos。这样,substr()函数将简单的返回从index开始的剩余的字符串。
	string str1("12345");
	cout << str1.substr(2,4)<<endl;//返回str1中下标为2~4的值 

输出结果:
在这里插入图片描述

  • swap()

语法:

void swap( basic_string &str );

  • 交换两个字符串的内容
  • swap()函数把str和本字符串交换。
	string str1("12345");
	string str2("123");
	str1.swap(str2);
	cout <<  str1 << " " << str2 << endl;

输出结果:

在这里插入图片描述


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

//定义 
void StrDefine()
{
	string str;  //空字符串	
	string str1( 5, 'a' );// 5个a 
    string str2( "123456789" );// str2为123456789 
    string str3( "123456789", 4 );// 前4个初始化给str3 
	string str4( str2, 0, 4);//从第0个开始取4个字符初始化给str4 
	string str5(str4);//拷贝str4 
	
	
	cout << str << endl;
    cout << str1 << endl;
    cout << str2 << endl;
    cout << str3 << endl;
    cout << str4 << endl; 
	cout << str5 << endl;
	cout << str.empty() << endl;
	cout << str2.empty() << endl;
}

//属性 
void StrPro()
{
	string str;  //空字符串	
	string str1( 5, 'a' );
    string str2( "123456789" );
 
	cout << str.capacity() << endl;
	cout << str1.capacity() << endl;
	cout << str2.capacity() << endl;
	
	str.reserve(20);
	str1.reserve(20);
	cout << str.capacity() << endl;
	cout << str1.capacity() << endl;
	
	cout << str.length() << endl;
	cout << str1.length() << endl;
	cout << str2.length() << endl;
	
	cout << str.size() << endl;
	cout << str1.size() << endl;
	cout << str2.size() << endl;
	
	str2.resize(5);
	cout << str2 << endl;
	cout << str2.size() << endl;
	
}

//输出
void StrCout()
{
	string str2( "123456789" );
	cout << str2 << endl;
	cout << str2.c_str() << endl;
	
	cout << str2[1] << endl;
	cout << str2.at(1) << endl;
} 

//修改 
void StrChang()
{
	string str2( "123456789" );
		
	str2[2] = 'M';
	cout << str2 << endl;
	
	str2.at(3) = 'M'; 
	cout << str2 << endl; 
}

//插入
void StrInsert()
{
	string str1( "MH");
	string str2( "123456789" );
	
	str2.insert( 2, "M");//在下表为 2的字符前面插入M 
	cout << str2 << endl;
		
	str2.insert( 4, str1);//在下标为 4的字符前面插入str1  
	cout << str2 << endl;
	
	str2.insert( 7, str1, 0, 1);//在下标为 7的字符前插入str1的第 0~1个字符
	cout << str2 << endl;
	
	str2.insert( 8, 1, 'H');//下标为 8的字符前插入 1个 'H' 
	cout << str2 << endl;

	string str3("MH");  
	string str4("123");

	str3 +=str4;//在str3尾巴加str4 
	cout << str3 << endl;
	
	str3 +="MH";//在str3后加MH 
	cout << str3 << endl;
	
	str3.append(str4);//在str3尾巴加str4
	cout << str3 << endl;
	
	str3.append("MH");//在str3后加MH
	cout << str3 << endl;
	
	str3.append("ABCD",3);//在str3后加字符串的耆前三个 
	cout << str3 << endl; 
}

//赋值
void StrAss()
{
	string str1("1234");
	string str2("1");
	cout << str1 << endl;
	str2 = str1;
	cout << str2 << endl;
	
//	string str3;
//	cout << "请输入:"<< endl;
//	cin >> str3;
//	cout << str3 << endl;
	
	string str4;
	str4.assign( str1);//将str1赋值给str4 
	cout << str4 << endl;
	
	str4.assign("asd", 2);//取前两个字符作为str4 
	cout << str4 << endl;
	
	str4.assign( str1, 0,2);//取str1的0~2作为str4的值 
	cout << str4 << endl;
	
	str4.assign( 3, 'g' );//三个g作为str4的值 
	cout << str4 << endl;
	
}

//其他函数
void StrFuntion()
{
	
	string str1("12345");
	string str2("123");
	
	cout << (str1 > str2) << endl;
	cout << (str1 < str2) << endl;
	cout << str1.compare(str2) << endl;
	cout << str1.compare(0,3,str2) << endl;
	cout << str1.compare(0,2, str2,0,2) <<endl;
	
	char arr[10];
	str1.copy(arr, 3,0);//将str1从第0个开始复制三个字符为arr 
	cout << arr << endl;
	
	cout << (int)str1.find(str2) << endl;
	//若找到,返回在str1找到子串str2的第一个字符的下标;若没有则返回 
	cout << (int)str1.find("1") << endl;//返回第一个找的下标 
	cout << (int)str1.find("2",1,0) << endl;//查找2在str1的下标
	cout << (int)str1.find("3",0)  << endl; //从下标为0开始找查 
	
	cout << str1.substr(2,4)<<endl;//返回str1中下标为2~4的值 

	str1.swap(str2);
	cout <<  str1 << " " << str2 << endl;
} 

void FunIterator()
{
	string str("abcdefg");
	string::iterator ite;
	ite = str.begin();
	for(size_t i = 0;i < str.size() ; i++){
		cout << *ite << " ";
		ite++;
	}
}
int main()
{
	//StrDefine();
	//StrPro();
	//StrCout();
	//StrChang();
	//StrInsert();
	//StrAss();
	//StrFuntion();
	FunIterator();
	
	system("pause"); 
	return 0;
}

发布了16 篇原创文章 · 获赞 75 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/diviner_s/article/details/104195100