==replace==
函数大体功能是将当前对象串中的一段字符串或字符用另一段字符串或字符替换。
(1) stringstring& replace (size_t pos, size_t len, const string& str);
string& replace (iterator i1, iterator i2, const string& str);
将当前对象相应位置替换为str。
(2) substringstring& replace (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen);
将当前对象相应位置替换为str对象由subpos位置开始,跨越sublen的子串(如果len过大超出串的范围,则取到str的末尾)
(3) c-stringstring& replace (size_t pos, size_t len, const char* s);
string& replace (iterator i1, iterator i2, const char* s);
将当前对象相应位置替换为s指向(由'\0'字符结尾)的字符串。
(4) bufferstring& replace (size_t pos, size_t len, const char* s, size_t n);
string& replace (iterator i1, iterator i2, const char* s, size_t n);
将当前对象相应位置替换为s指向的前n个字符组成字符串。
(5) fillstring& replace (size_t pos, size_t len, size_t n, char c);
string& replace (iterator i1, iterator i2, size_t n, char c);
将当前对象相应位置替换为n个char类型的c字符。
(6) rangetemplate <class InputIterator>
string& replace (iterator i1, iterator i2, InputIterator first, InputIterator last);
将当前对象相应位置替换为迭代器区间[first,last)内的字符序列*。
使用案例:
// replacing in a string
#include <iostream>
#include <string>
using namespace std;
int main()
{
string base = "this is a test string.";
string str2 = "n example";
string str3 = "sample phrase";
string str4 = "useful.";
// replace signatures used in the same order as described above:
// Using positions: 0123456789*123456789*12345
string str = base; // "this is a test string."
str.replace(9, 5, str2); // "this is an example string." (1)
str.replace(19, 6, str3, 7, 6); // "this is an example phrase." (2)
str.replace(8, 10, "just a"); // "this is just a phrase." (3)
str.replace(8, 6, "a shorty", 7); // "this is a short phrase." (4)
str.replace(22, 1, 3, '!'); // "this is a short phrase!!!" (5)
// Using iterators: 0123456789*123456789*
str.replace(str.begin(), str.end() - 3, str3); // "sample phrase!!!" (1)
str.replace(str.begin(), str.begin() + 6, "replace"); // "replace phrase!!!" (3)
str.replace(str.begin() + 8, str.begin() + 14, "is coolness", 7); // "replace is cool!!!" (4)
str.replace(str.begin() + 12, str.end() - 4, 4, 'o'); // "replace is cooool!!!" (5)
str.replace(str.begin() + 11, str.end(), str4.begin(), str4.end());// "replace is useful." (6)
cout << str << '\n';
return 0;
}
==swap==
void swap (string& str);
交换两个string对象的内容。
使用案例:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1("hello");
string str2("world");
cout << str1 << endl;
cout << str2 << endl;
str1.swap(str2);
cout << endl;
cout << str1 << endl;
cout << str2 << endl;
return 0;
}
注:此函数比algorithm提供的swap交换更优,是string交换的最优方式。故交换string对象时尽量使用此方法。
🔥非成员函数重载(Non-member function overloads)
非成员函数重载,是作为string类的友元函数,在类的外面定义和实现,通过类型来匹配非成员函数。
==operator+==
这里其实不用过多赘述,六个重载实现了string对象相加的功能(string对象+字符串,string对象+字符,字符串+string对象,字符+string对象,string对象+string对象)。
注:没有 -> 字符串+字符串
代码案例:
// concatenating strings
#include <iostream>
#include <string>
using namespace std;
int main()
{
string firstlevel("com");
string secondlevel("cplusplus");
string scheme("http://");
string hostname;
string url;
hostname = "www." + secondlevel + '.' + firstlevel;
url = scheme + hostname;
cout << url << '\n';
return 0;
}
==relation operators(string)==
重载了string对象之间进行比较大小的功能,比较规则就是字典序。
代码案例:
// string comparisons
#include <iostream>
#include <vector>
using namespace std;
int main()
{
string foo = "alpha";
string bar = "beta";
if (foo == bar) cout << "foo and bar are equal\n";
if (foo != bar) cout << "foo and bar are not equal\n";
if (foo < bar) cout << "foo is less than bar\n";
if (foo > bar) cout << "foo is greater than bar\n";
if (foo <= bar) cout << "foo is less than or equal to bar\n";
if (foo >= bar) cout << "foo is greater than or equal to bar\n";
return 0;
}
==swap(string)==
交换strirng对象。
代码案例:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1("hello");
string str2("world");
cout << str1 << endl;
cout << str2 << endl;
swap(str1, str2);
cout << endl;
cout << str1 << endl;
cout << str2 << endl;
return 0;
}
此非成员函数也可以实现string对象的交换,但是这个实现与重载在string类中的不同,string对象在交换串的时候是改变指针指向交换的。而这里的swap是使用tmp存储临时对象的方式实现交换,增大了内存开销。
==流插入和流提取重载==
控制台输入将内容读取到string对象中。
将内容输入到控制台。
使用案例:
// inserting strings into output streams
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
cin >> str;
cout << str << '\n';
return 0;
}
注:cin的读入是按照空格和换行进行分隔的,当你输入
hello world
时,使用上面的cin只能读取到hello。
如下:
当面对这种情况时,就需要我们的getline出手了。==getline==
功能和cin相同,但可以通过此函数更改字符串读取时的分隔方式。
(1)istream& getline (istream& is, string& str, char delim);
当你传第三个参数时,调用此函数,会以delim为分隔符进行分隔。
(2)istream& getline (istream& is, string& str);
当不传第三个参数,会默认以'\n'为分隔符。
使用案例:
// extract to string
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name;
cout << "Please, enter your full name: ";
getline(cin, name);
cout << "Hello, " << name << "!\n";
return 0;
}
结语
本篇博客,介绍了关于string的修改器,能修改string串中的内容;以及非成员函数的重载,实现了一些成员函数无法完成的功能和任务。
博主会继续分享关于string类的使用以及STL更多的内容,感谢大家的支持。♥