字符串替换函数 replace 是C++为string类添加的用于快速替换的函数。查看重载的个数
从图中可以看出,replace重载了10次
先看源码
// 01. string& replace(unsigned int start_id, unsigned int len, const string& obj); 调用了02_Myt& replace(size_type _P0, size_type _N0, const _Myt& _X){ return (replace(_P0, _N0, _X, 0, npos)); }// 02. string& replace(unsigned int start_id, unsigned int len, \ const string& obj, unsigned int start_id2, unsigned int len2);_Myt& replace(size_type _P0, size_type _N0, const _Myt& _X, size_type _P, size_type _M){ if (_Len < _P0 || _X.size() < _P) _Xran(); if (_Len - _P0 < _N0) _N0 = _Len - _P0; size_type _N = _X.size() - _P; if (_N < _M) _M = _N; if (npos - _M <= _Len - _N0) _Xlen(); _Split(); size_type _Nm = _Len - _N0 - _P0; if (_M < _N0) _Tr::move(_Ptr + _P0 + _M, _Ptr + _P0 + _N0, _Nm); if ((0 < _M || 0 < _N0) && _Grow(_N = _Len + _M - _N0)) { if (_N0 < _M) _Tr::move(_Ptr + _P0 + _M, _Ptr + _P0 + _N0, _Nm); _Tr::copy(_Ptr + _P0, &_X.c_str()[_P], _M); _Eos(_N); } return (*this); }// 03. string& replace(unsigned int start_id, unsigned int len, const char* str, unsigned int len2);_Myt& replace(size_type _P0, size_type _N0, const _E *_S, size_type _M){ if (_Len < _P0) _Xran(); if (_Len - _P0 < _N0) _N0 = _Len - _P0; if (npos - _M <= _Len - _N0) _Xlen(); _Split(); size_type _Nm = _Len - _N0 - _P0; if (_M < _N0) _Tr::move(_Ptr + _P0 + _M, _Ptr + _P0 + _N0, _Nm); size_type _N; if ((0 < _M || 0 < _N0) && _Grow(_N = _Len + _M - _N0)) { if (_N0 < _M) _Tr::move(_Ptr + _P0 + _M, _Ptr + _P0 + _N0, _Nm); _Tr::copy(_Ptr + _P0, _S, _M); _Eos(_N); } return (*this); }// 04. string& replace(unsigned int start_id, unsigned int len, const char* str); 调用了_Myt& replace(size_type _P0, size_type _N0, const _E *_S){ return (replace(_P0, _N0, _S, _Tr::length(_S))); }// 05. string& replace(unsigned int start_id, unsigned int len, unsigned int len2, char ch); 调用了_Myt& replace(size_type _P0, size_type _N0, size_type _M, _E _C){ if (_Len < _P0) _Xran(); if (_Len - _P0 < _N0) _N0 = _Len - _P0; if (npos - _M <= _Len - _N0) _Xlen(); _Split(); size_type _Nm = _Len - _N0 - _P0; if (_M < _N0) _Tr::move(_Ptr + _P0 + _M, _Ptr + _P0 + _N0, _Nm); size_type _N; if ((0 < _M || 0 < _N0) && _Grow(_N = _Len + _M - _N0)) { if (_N0 < _M) _Tr::move(_Ptr + _P0 + _M, _Ptr + _P0 + _N0, _Nm); _Tr::assign(_Ptr + _P0, _M, _C); _Eos(_N); } return (*this); }// 06. string& replace(iterator first, iterator last, const string& obj);_Myt& replace(iterator _F, iterator _L, const _Myt& _X){ return (replace(_Pdif(_F, begin()), _Pdif(_L, _F), _X)); } // 07. string& replace(iterator first, iterator last, const char* str, unsigned int len); _Myt& replace(iterator _F, iterator _L, const _E *_S, size_type _M){ return (replace(_Pdif(_F, begin()), _Pdif(_L, _F), _S, _M)); } // 08. string& replace(iterator first, iterator last, const char* str); _Myt& replace(iterator _F, iterator _L, const _E *_S){ return (replace(_Pdif(_F, begin()), _Pdif(_L, _F), _S)); } // 09. string& replace(iterator first, iterator last, unsigned int len, char ch); _Myt& replace(iterator _F, iterator _L, size_type _M, _E _C){ return (replace(_Pdif(_F, begin()), _Pdif(_L, _F), _M, _C)); }// 10. string& replace(iterator first, iterator last, iterator first2, iterator last2); 迭代器_Myt& replace(iterator _F1, iterator _L1, _It _F2, _It _L2){ size_type _P0 = _Pdif(_F1, begin()); size_type _M = 0; _Distance(_F2, _L2, _M); replace(_P0, _Pdif(_L1, _F1), _M, _E(0)); for (_F1 = begin() + _P0; 0 < _M; ++_F1, ++_F2, --_M) *_F1 = *_F2; return (*this); }
测试代码
string str1 = "Hello_World_Welcome"; string str2 = "#####";string str3 = "*****";cout << "str1 -> " << str1 << "\t str2 -> " << str2 << "\t str3 -> " << str3 << endl;// 01. string& replace(unsigned int start_id, unsigned int len, const string& obj); 调用了02cout << "string& replace(unsigned int start_id, unsigned int len, const string& obj);" << endl;cout << "str1.replace(0, str2.size(), str2) -> " << str1.replace(0, str2.size(), str2) << endl;str1 = "Hello_World_Welcome";cout << "str1.replace(5, str3.size(), str3) -> " << str1.replace(5, str3.size(), str3) << endl;cout << "########################################" << endl;// 02. string& replace(unsigned int start_id, unsigned int len, \ const string& obj, unsigned int start_id2, unsigned int len2);cout << "string& replace(unsigned int start_id, unsigned int len, const string& obj, " << "unsigned int start_id2, unsigned int len2);" << endl;cout << "str1.replace(7, str2.size(), str2, 0, str2.size()) -> " << str1.replace(7, str2.size(), str2, 0, str2.size()) << endl;str1 = "Hello_World_Welcome";cout << "str1.replace(11, str3.size(), str3, 0, str3.size()) -> " << str1.replace(1, str3.size(), str3, 0, str3.size()) << endl;cout << "########################################" << endl;// 03. string& replace(unsigned int start_id, unsigned int len, const char* str, unsigned int len2);cout << "string& replace(unsigned int start_id, unsigned int len, " << "const char* str, unsigned int len2); " << endl;cout << "str1.replace(10, str2.size(), str2.c_str(), str2.size()) -> " << str1.replace(10, str2.size(), str2.c_str(), str2.size()) << endl;str1 = "Hello_World_Welcome";cout << "str1.replace(13, str3.size(), str3.c_str(), str3.size()) -> " << str1.replace(13, str3.size(), str3.c_str(), str3.size()) << endl;cout << "########################################" << endl;// 04. string& replace(unsigned int start_id, unsigned int len, const char* str); 调用了cout << "string& replace(unsigned int start_id, unsigned int len, const char* str); " << endl;cout << "str1.replace(6, str2.size(), str2.c_str()) -> " << str1.replace(6, str2.size(), str2.c_str()) << endl;str1 = "Hello_World_Welcome";cout << "str1.replace(4, str3.size(), str3.c_str()) -> " << str1.replace(4, str3.size(), str3.c_str()) << endl;cout << "########################################" << endl;// 05. string& replace(unsigned int start_id, unsigned int len, unsigned int len2, char ch); 调用了cout << "string& replace(unsigned int start_id, unsigned int len, unsigned int len2, char ch); " << endl;cout << "str1.replace(3, str2.size(), str2.size(), str2[5]) -> " << str1.replace(3, str2.size(), str2.size(), str2[5]) << endl;str1 = "Hello_World_Welcome";cout << "str1.replace(6, str3.size(), str3.size(), str3[5]) -> " << str1.replace(6, str3.size(), str3.size(), str3[5]) << endl;cout << "########################################" << endl;// 06. string& replace(iterator first, iterator last, const string& obj);cout << "string& replace(iterator first, iterator last, const string& obj); " << endl;cout << "str1.replace(str1.begin()+5, str1.begin()+5+str2.size(), str2) -> " << str1.replace(str1.begin()+5, str1.begin()+5+str2.size(), str2) << endl;str1 = "Hello_World_Welcome";cout << "str1.replace(str1.begin()+3, str1.begin()+3+str3.size(), str3) -> " << str1.replace(str1.begin()+3, str1.begin()+3+str3.size(), str3) << endl;cout << "########################################" << endl;// 07. string& replace(iterator first, iterator last, const char* str, unsigned int len); cout << "string& replace(iterator first, iterator last, const char* ch, unsigned int len); " << endl;cout << "str1.replace(str1.begin()+2, str1.begin()+2+str2.size(), str2.c_str(), str2.size()) -> " << str1.replace(str1.begin()+2, str1.begin()+2+str2.size(), str2.c_str(), str2.size()) << endl;str1 = "Hello_World_Welcome";cout << "str1.replace(str1.begin()+1, str1.begin()+1+str3.size(), str3.c_str(), str3.size()) -> " << str1.replace(str1.begin()+1, str1.begin()+1+str3.size(), str3.c_str(), str3.size()) << endl;cout << "########################################" << endl;// 08. string& replace(iterator first, iterator last, const char* str); cout << "string& replace(iterator first, iterator last, const char* ch); " << endl;cout << "str1.replace(str1.begin()+4, str1.begin()+4+str2.size(), str2.c_str()) -> " << str1.replace(str1.begin()+4, str1.begin()+4+str2.size(), str2.c_str()) << endl;str1 = "Hello_World_Welcome";cout << "str1.replace(str1.begin()+5, str1.begin()+5+str3.size(), str3.c_str()) -> " << str1.replace(str1.begin()+5, str1.begin()+5+str3.size(), str3.c_str()) << endl;cout << "########################################" << endl;// 09. string& replace(iterator first, iterator last, unsigned int len, char ch); cout << "string& replace(iterator first, iterator last, unsigned int len, char ch); " << endl;cout << "str1.replace(str1.begin()+7, str1.begin()+7+str2.size(), str2.size(), str2[0]) -> " << str1.replace(str1.begin()+7, str1.begin()+7+str2.size(), str2.size(), str2[0]) << endl;str1 = "Hello_World_Welcome";cout << "str1.replace(str1.begin()+9, str1.begin()+9+str3.size(), str3.size(), str3[0]) -> " << str1.replace(str1.begin()+9, str1.begin()+9+str3.size(), str3.size(), str3[0]) << endl;cout << "########################################" << endl;// 10. string& replace(iterator first, iterator last, iterator first2, iterator last2); 迭代器cout << "string& replace(iterator first, iterator last, iterator first2, iterator last2); " << endl;cout << "str1.replace(str1.begin()+6, str1.begin()+6+str2.size(), str2.begin(), str2.end()) -> " << str1.replace(str1.begin()+6, str1.begin()+6+str2.size(), str2.begin(), str2.end()) << endl;str1 = "Hello_World_Welcome";cout << "str1.replace(str1.begin()+8, str1.begin()+8+str3.size(), str3.begin(), str3.end()) -> " << str1.replace(str1.begin()+8, str1.begin()+8+str3.size(), str3.begin(), str3.end()) << endl;cout << "########################################" << endl;
显示运行结果
另外还有 max_size, resize, swap等函数
string str1 = "Hello_World_welcome";cout << "str1.max_size() -> " << str1.max_size() << endl;cout << "############################" << endl;cout << "str1 -> " << str1 << endl;str1.resize(10);cout << "str1.resize(10) -> " << str1 << endl;cout << "str1 -> " << str1 << endl;cout << "############################" << endl;str1 = "Hello_World_welcome";str1.swap(string());cout << "str1.swap(string()) -> " << str1 << endl;str1 = "Hello_World_welcome";str1.swap(string("###########"));cout << "str1.swap(string(\"###########\")) -> " << str1 << endl; cout << "##############################" << endl;
显示运行结果
红色表示的部分,不是机器问题没有显示出来而是处理完之后,str1本身已经没有内容,所以显示为空
到此为止。C++ string类的成员函数以及全部介绍完了。明天会做一个总结
并做一个有趣的项目,将所学的知识合理地表示出来。