前言
本篇博客主要内容:STL库中string的修改器(Modifiers)和非成员函数重载(Non-member function overloads)。
来到string类的使用第三篇,继续我们的内容,本篇博客将介绍如何使用STL库中string的成员函数修改串,以及重载给string的几个非成员函数。
🔥修改器(Modifiers)
顾名思义,就是一批能改动string串中内容的成员函数。
==operator+===
这是一个成员函数的运算符重载。
简单说就是在串的末尾追加字符或字符串。
(1) string string对象string& operator+= (const string& str);
(2) c-string 字符串指针string& operator+= (const char* s);
(3) character 字符string& operator+= (char c);
以上三个重载的功能用一句话概括:在当前string串的末尾追加字符或字符串。
共同的返回值:当前对象的引用(string&)。
使用样例:
// string::operator+=
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name("John");
string family("Smith");
name += " K. "; // c-string
name += family; // string
name += '\n'; // character
cout << name;
return 0;
}
==append==
append的功能和操作符重载的+=类似,也是在串的末尾追加内容,不过append提供的重载更多,追加字符或字符串的方式也更多。
(1) stringstring& append (const string& str);
在string对象串的末尾追加str串的拷贝。
(2) substringstring& append (const string& str, size_t subpos, size_t sublen);
在string对象串的末尾追加一个str的子串,这个子串从str下标位置subpos开始取,取sublen个字符(如果sublen过大超出str串的范围,则取到str的末尾)。
(3) c-stringstring& append (const char* s);
在string对象串的末尾追加s指向的以'\0'字符结尾的字符串的拷贝。
(4) bufferstring& append (const char* s, size_t n);
在string对象串的末尾追加s指向的前n个字符的拷贝。
(5) fillstring& append (size_t n, char c);
在string对象串的末尾追加n个char类型的c字符。
(6) rangetemplate <class InputIterator>
string& append (InputIterator first, InputIterator last);
在string对象串的末尾按顺序追加迭代器区间[first,last)之间指向的字符序列。
共同的返回值:当前对象的引用(string&)。
使用案例:
// appending to string
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
string str2 = "Writing ";
string str3 = "print 10 and then 5 more";
// used in the same order as described above:
str.append(str2); // "Writing "
str.append(str3, 6, 3); // "10 "
str.append("dots are cool", 5); // "dots "
str.append("here: "); // "here: "
str.append(10, '.'); // ".........."
str.append(str3.begin() + 8, str3.end()); // " and then 5 more"
cout << str << endl;
return 0;
}
==push_back和pop_back==
void push_back (char c);
在string对象串的末尾追加一个char类型的字符c。
无返回值。void pop_back();
在string对象串的末尾删除一个字符。
无返回值和参数。
使用案例:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str("hello world");
str.push_back('!');
cout << str << endl;
str.pop_back();
cout << str << endl;
return 0;
}
==assign==
大体功能是给当前串赋新值,将原来的内容覆盖。
(1) stringstring& assign (const string& str);
拷贝str。
(2) substringstring& assign (const string& str, size_t subpos, size_t sublen);
拷贝str从下标subpos开始的sublen个字符(如果sublen过大超出str串的范围,则取到str的末尾)。
(3) c-stringstring& assign (const char* s);
拷贝s指向的以'\0'字符结尾的字符串。
(4) bufferstring& assign (const char* s, size_t n);
拷贝s指向的前n个字符。
(5) fillstring& assign (size_t n, char c);
拷贝n个字符c组成的字符串。
(6) rangetemplate <class InputIterator>
string& assign (InputIterator first, InputIterator last);
按顺序拷贝迭代器区间[first,last)内的字符序列。
使用案例:
// string::assign
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
string base = "The quick brown fox jumps over a lazy dog.";
// used in the same order as described above:
str.assign(base);
cout << str << endl;
str.assign(base, 10, 9);
cout << str << endl; // "brown fox"
str.assign("pangrams are cool", 7);
cout << str << endl; // "pangram"
str.assign("c-string");
cout << str << endl; // "c-string"
str.assign(10, '*');
cout << str << endl; // "**********"
str.assign(base.begin() + 16, base.end() - 12);
cout << str << endl; // "fox jumps over"
return 0;
}
==insert==
大体功能是往串中插入字符或字符串。
(1) string
string& insert (size_t pos, const string& str);
在pos位置之前插入str串的拷贝。
(2) substringstring& insert (size_t pos, const string& str, size_t subpos, size_t sublen);
在pos位置之前插入str的子串的拷贝(由subpos开始,取sublen个字符组成的字符串。如果sublen过大超出str串的范围,则取到str的末尾)。
(3) c-stringstring& insert (size_t pos, const char* s);
在pos位置前插入s指向(由'\0'字符结尾)的字符串的拷贝。
(4) buffer
string& insert (size_t pos, const char* s, size_t n);
在pos位置前插入s指向的前n个字符组成字符串的拷贝。
(5) fillstring& insert(size_t pos,size_t n,char c);
void insert (iterator p,size_t n,char c);
在pos位置前(或迭代器p指向位置前,此时无返回值)插入n个char类型的c字符。
(6) single characteriterator insert (iterator p, char c);
迭代器p指向位置前插入一个char类型的c字符。
(7) rangetemplate <class InputIterator>
void insert (iterator p, InputIterator first, InputIterator last);
迭代器p指向的位置前按顺序插入迭代器区间[first,last)内的字符序列。
使用样例:
// inserting into a string
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str = "to be question";
string str2 = "the ";
string str3 = "or not to be";
string::iterator it;
// used in the same order as described above:
str.insert(6, str2); // to be (the )question
str.insert(6, str3, 3, 4); // to be (not )the question
str.insert(10, "that is cool", 8); // to be not (that is )the question
str.insert(10, "to be "); // to be not (to be )that is the question
str.insert(15, 1, ':'); // to be not to be(:) that is the question
it = str.insert(str.begin() + 5, ','); // to be(,) not to be: that is the question
str.insert(str.end(), 3, '.'); // to be, not to be: that is the question(...)
str.insert(it + 2, str3.begin(), str3.begin() + 3); // (or )
cout << str << endl;
return 0;
}
==erase==
将串中指定内容删除,使串的长度减少
(1) sequencestring& erase (size_t pos = 0, size_t len = npos);
将从pos开始的len个长度的字符删除(如果len过大超出串的范围或未提供第二个参数,则删到str的末尾)。
(2) characteriterator erase (iterator p);
删除迭代器p指向的一个字符。
(3) rangeiterator erase (iterator first, iterator last);
删除迭代器区间[first,last)之间的元素。
注:除了第一个返回当前对象,其他两个的返回值为第一个被删除字符位置的迭代器,如果此时这个位置没有字符,则返回指向末尾的迭代器string::end。
使用案例:
// string::erase
#include <iostream>
#include <string>
using namespace std;
int main()
{
std::string str("This is an example sentence.");
cout << str << '\n';
// "This is an example sentence."
str.erase(10, 8); // ^^^^^^^^
cout << str << '\n';
// "This is an sentence."
str.erase(str.begin() + 9); // ^
cout << str << '\n';
// "This is a sentence."
str.erase(str.begin() + 5, str.end() - 9); // ^^^^^
cout << str << '\n';
// "This sentence."
return 0;
}