文章目录
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;
输出结果为:
属性
语法:
bool empty();
- 若字符串为空,返回真
- end()函数返回一个迭代器,指向字符串的末尾(最后一个字符的下一个位置).
string str();
strint str2("123456789");
cout << str2.empty() << endl;
cout << str.empty() << endl;
运行结果如下:
语法:
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;
运行结果如下:
语法:
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;
运行结果如下:
语法:
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_type size();
- 返回字符串中字符的数量
- size()函数返回字符串中现在拥有的字符数。
string str; //空字符串
string str1( 5, 'a' );
string str2( "123456789" );
cout << str.size() << endl;
cout << str1.size() << endl;
cout << str2.size() << endl;
运行结果如下:
语法:
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
语法:
const char *c_str();
- 将字符串以C字符数组的形式返回
- c_str()函数返回一个指向正规C字符串的指针, 内容与本字符串相同.
string str2( "123456789" );
cout << str2.c_str() << endl;
输出结果为:123456789
- 下标输出
string str2( "123456789" );
cout << str2[1] << endl;
//通过下标运算输出指定元素,注意不可以越界,越界会崩溃
输出结果为:
语法:
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;
运行结果:
string str2( "123456789" );
str2.at(2) = 'M';
cout << str2 << endl;
运行结果:
插入
语法:
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;
输出结果:
语法:
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;
输出结果:
语法:
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;
输出结果:
语法:
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.
操作函数
语法:
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
输出结果:
语法:
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
输出结果:
语法:
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开始找查
输出结果:
语法:
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的值
输出结果:
语法:
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;
}