一、Modifiers(修饰符):
1、operator+=
这个成员函数给一个string类类型的对象进行追加,在现有的string后面追加string类、字符串或者字符;
代码示例:
void test1()
{
std::string s1("Hello ");
std::cout << s1 << std::endl;
//operator+= 追加
s1 += "world";
s1 += '!';
std::cout << s1 << std::endl;
std::string s2("Welcome!");
s1 += s2;
std::cout << s1 << std::endl;
}
2、append(追加)
这个成员函数也是在string后面追加;
(1)追加string类;(2)追加一个string类的一部分(从下标subpos开始到sublen个字符结束);(3)追加一个字符串;(4)追加一个字符串的前n个字符;(5)追加n个字符c;(6)追加一个string类的一部分,利用迭代器指明起始位置。
代码示例:
void test2()
{
std::string s1("Who ");
std::string s2("are *******");
const char* s3 = "you";
s1.append(s2, 0, 4);//4表示追加4个字符
s1.append(s3);
s1.append(1,'?');
std::cout << s1 << std::endl;
}
3、push_back
给string类类型的字符串追加一个字符;
代码示例:
void test3()
{
std::string s1("Good ");
char c1 = 'L';
char c2 = 'u';
char c3 = 'c';
char c4 = 'k';
char c5 = '!';
s1.push_back(c1);
std::cout << s1 << std::endl;
s1.push_back(c2);
std::cout << s1 << std::endl;
s1.push_back(c3);
std::cout << s1 << std::endl;
s1.push_back(c4);
std::cout << s1 << std::endl;
s1.push_back(c5);
std::cout << s1 << std::endl;
}
4、assign
将内容分配给字符串;
代码示例:
test(4)
{
std::string str;
std::string base = "The quick brown fox jumps over a lazy dog.";
str.assign(base);
std::cout << str << "\n";
str.assign(base, 10, 9);//从第10个位置开始,向后扫描9个字符,assign进去
std::cout << str << "\n";
str.assign("programs are cool", 7);//字符串的前7个
std::cout << str << "\n";
str.assign("c-string");
std::cout << str << "\n";
str.assign(10, '*');
std::cout << str << "\n";
str.assign(base.begin() + 16, base.end() - 12);
std::cout << str << "\n";
}
5、insert
在指定的下标位置之前插入字符串、字符或者string类; pos代表指定的下标位置;
代码示例:
void test5()
{
std::string str = "Wrold";
std::string s1 = "Hello ";
str.insert(0, s1);
std::cout << str << "\n";
str.insert(str.size(), 1, '!');
std::cout << str << "\n";
}
6、erase
删除string类对象里面的一部分字符; (1)默认从第一个字符开始,默认删除整个string类对象。传参控制删除的区间;(2)删除从p开始之后的内容;(3)利用迭代器指定区间(左闭右开),删除;
代码示例:
void test6()
{
std::string str("There is nothing.");
std::cout << str << "\n";
str.erase(9);//从下标为9的字符删除完
std::cout << str << std::endl;
str.erase(str.begin(), str.end() - 3);
std::cout << str << "\n";
str.erase(str.begin() + 1);
std::cout << str << "\n";
}
7、replace
对于一个string类对象,指定它某一个字符下标为起始位置,扫描len个长度的字符,替换成给出的字符串、字符、string类; 迭代器指定的区域左闭右开;
代码示例:
void test7()
{
std::string str("xxxxx_yyyyy");
str.replace(0, 3, "y");
std::cout << str << std::endl;
str.replace(str.begin() + 4, str.end(), "x");
std::cout << str << std::endl;
}
8、swap
交换两个string类对象 ;
代码示例:
void test8()
{
std::string s1("xxx");
std::string s2("***");
s1.swap(s2);
std::cout << s1 << "\n" << s2 << std::endl;
}
9、pop_back
尾删一个string类对象的一个字符;
代码示例:
{
std::string str("ABCDEFG");
str.pop_back();
str.pop_back();
std::cout << str << std::endl;
}
二、string类对象操作
1、c_str
用来接收一个string的对象指针,这个指针指向字符串开头的位置,返回一个const char* 的指针;
代码示例:
void test1()
{
string str("This is an apple");
const char* cstr = str.c_str();
cout << cstr << endl;
cout << str<< endl;
}
2、data
与c_str用法类似 ;
3、copy
拷贝一个string类对象的一个子串给一个由s指向的字符串;从pos开始拷贝,拷贝len个字符,若是stirng不够拷贝,那就拷贝整个stirng类对象;
代码示例:
//copy
void test2()
{
string str("everything is nice");
char buffer[20];
size_t _length = str.copy(buffer,10,0);
buffer[_length] = '\0';
cout << buffer << endl;
}
4、find
从一个string类对象里面找字符串、字符或者string对象,找到了返回开始匹配的下标;没有找到返回string::npos
(3)意为从string的pos1下标开始找,找与s里面前n个开始匹配的位置;
代码示例:
//find
void test3()
{
string str("Hello World!");
size_t pos1 = str.find('!', 0);
size_t pos2 = str.find("Hello", 0);
string str2("World");
size_t pos3 = str.find(str2, 0);
cout << pos1 << " " << pos2 << " " << pos3 << endl;
size_t pos4 = str.find(" World", 0, 3);
cout << pos4 << endl;
}
5、refind
和find原理相同,只是从最后倒着开始找;
6、find_first_of 和find_last_of
find_first_of 意为按正向顺序查早,查找string类中与给出的查找对象中任意字符匹配的下标;
代码示例:
//find_first_of
void test4()
{
string str("Please, replace the vowels in this sentence by asterisks.");
size_t pos = str.find_first_of("aeiou");//从下标为0处开始,在str中找与"aeiou"中任意字符匹配的下标
while (pos!= string::npos)
{
str[pos] = '*';
pos = str.find_first_of("aeiou", pos + 1);//指明开始查找的位置,以免重复查找已查找的位置
}
//最后str里面的"aeiou"全部被替换成'*'
cout << str << endl;
}
find_last_of和 find_first_of原理相同,只是从后面开始查找起;
7、find_first_not_of 和find_last_not_of
查找string类中不为给出查找对象中任意字符的位置;
代码示例:
void test5()
{
string str("Please, replace the vowels in this sentence by asterisks.");
size_t pos = str.find_first_not_of("aeiou");
while (pos != string::npos)
{
str[pos] = '*';
pos = str.find_first_not_of("aeiou", pos + 1);
}
cout << str << endl;
}
find_last_not_of从后面开始查找
8、substr
从一个string对象中拷贝一个子串,从pos开始拷贝,拷贝len个字符,返回string类的子串
代码示例:
void test6()
{
string str("What a nice day!");
string _substr = str.substr(0, 10);
cout << _substr << endl;
}
三、string类模板中的非成员函数
成员函数默认第一个参数是this指针,传参时也不能改变,而有些函数的传参第一个实参不一定是this指针指向的对象,因此要将这些函数定义在类外,方便传参;
1、operator+
此函数可以将string、字符或者字符串之间相加;
代码实现:
//operator+
void test7()
{
string str = "www";
const char* s1 = "cplusplus";
char i = '.';
string s2 = "com";
string rsl;
rsl = str + i + s1 + i + s2;
cout << rsl << endl;
}
2、relational operators
此函数中定义了string对象之间的比较;
代码示例:
//relational operators
void test8()
{
// string comparisons
std::string foo = "alpha";
std::string bar = "beta";
if (foo == bar) std::cout << "foo and bar are equal\n";
if (foo != bar) std::cout << "foo and bar are not equal\n";
if (foo < bar) std::cout << "foo is less than bar\n";
if (foo > bar) std::cout << "foo is greater than bar\n";
if (foo <= bar) std::cout << "foo is less than or equal to bar\n";
if (foo >= bar) std::cout << "foo is greater than or equal to bar\n";
}
3、swap
交换两个string类对象:
4、operator<< 和 operator>>
重载输出和输入函数;
第一个参数是cout或者cin,这也符合代码标准输入输出流的书写;
代码示例:
//operator<< 、operator>>
void test9()
{
string str;
cin >> str;
cout << str;
cout << endl;
string str2 = "ancd";
cout << str2;
}
5、getline
此函数是输入string的;对于一般的输入cin来说,碰见空格就说明输入完成,但是有些情况要把空格以及空格之后的字符也算成这个string类;
一般来说(也就是(2)),碰见'\n'也就是换行就会终止;若是在第三个参数指明了终止的字符,那么就一直读取,直到碰见这个指定的字符才结束;
getline不会读取结束标志的字符,而是将它作为'\0'读取进入string;
代码示例:
string str1;
cout << "输入一个字符串:";
//输入一个含空字符的字符串,cin只能读取空字符前面的内容
cin >> str1;
cout << str1 << endl;
只能读取空字符前面的内容;
cout << "输入一个字符串:";
string str2;
getline(cin, str2);//默认碰见'\n'结束
cout << str2;
getline遇到换行符结束;
cout << "输入一个字符串:";
string str3;
getline(cin, str3, 'Z');//指定碰见'Z'结束
cout << "**********************";
cout << str3;
碰见'Z',才结束读取,换行符也读;