[C++] String类常用接口使用
String 是表示字符串的字符串类。在使用string类时,必须包含#include头文件以及using namespace std。
常用接口
Constructor
string(); //构造空的String类对象,即空字符串
string(const char* s); //用C-string来构造string类对象
string(size_t n, char c); //string类对象中包含n个字符c
string(const string &s); //拷贝构造函数
String类对象的容量操作
size_t size() const; //返回字符串的有效长度
size_t length() const; //返回字符串的有效长度
size_t capacity() const; //返回底层容量大小,只扩容,不会改变有效元素个数
bool empty() const;//判断字符串是否为空串,为空返回True,不为空返回False
void clear(); //清空字符串,不清空底层容量大小
void reserve (size_t n = 0); //改变底层容量的大小
**/
reserve:
- 扩容函数–只是扩容,不会改变有效元素个数
- reserve(n): n只有比当前string类对象底层空间容量大的情况下才会真正扩容,而且一般情况下不会直接将容量给成n
- reserve(n): n小于当前string类对象底层空间时,reserve会忽略本次操作,除非n < 15
- reserve方法一般只会将容量扩大,而不会将空间缩小的,
- string类为了提高性能,在其类中管理一个长度为16个字符的数组
/**
void resize (size_t n); //有效字符数改变为n个,多出来的用0填充
void resize (size_t n, char c); //改变有效字符个数为n个,多余的用字符c填充
**/
resize(newsize, ch): 假设string类的有效元素个数为size,容量为capacity
- newsize < size: 只是将有效元素个数改变到newsize即可,不会缩小容量
- size<newsize<capacity: 直接将有效元素个数增加到newsize,多出的newsize-size个元素使用ch(0)进行填充
- newsize > capacity: 扩容-:申请新空间,拷贝元素,释放旧空间–将新元素个数增加到newsize个,多出的newsize-size个元素使用ch(0)进行填充
/**
vs-string的扩容方式是按照1.5倍的方式进行扩容的
注意:linux-SGI-STL string扩容的方式:是按照2倍的方式扩容的
按照两倍的方式扩容好呢还是按照1.5倍的方式扩容比较好?
String类对象的修改操作
void push_back (char c); //在字符串后面尾插字符c
string& append (const string& str);
string& append (const char* s);
string& append (size_t n, char c); //在字符串后面追加字符串
string& operator+= (const string& str);
string& operator+= (const char* s);
string& operator+= (char c); //在字符串后面追加字符串str
const char* c_str() const;//返回C格式字符串
size_t find (char c, size_t pos = 0) const; // 从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
size_t rfind (const string& str, size_t pos = npos) const;
size_t rfind (const char* s, size_t pos = npos) const;
size_t rfind (const char* s, size_t pos, size_t n) const;
size_t rfind (char c, size_t pos = npos) const; //从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
string substr (size_t pos = 0, size_t len = npos) const;//在str中从pos位置开始,截取n个字符,然后将其返回
string& insert (size_t pos, const string& str);
string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);
string& insert (size_t pos, const char* s);
string& insert (size_t pos, const char* s, size_t n);
string& insert (size_t pos, size_t n, char c);
void insert (iterator p, size_t n, char c);
iterator insert (iterator p, char c);
template
void insert (iterator p, InputIterator first, InputIterator last)// 任意位置插入
string& erase (size_t pos = 0, size_t len = npos);
iterator erase (iterator p);
iterator erase (iterator first, iterator last);//移除任意字符串,有效长度将减小
void swap (string& str);//交换字符串
void Teststring()
{
string str;
str.push_back(' '); // 在str后插入空格
str.append("Hello"); // 在str后追加一个字符"hello"
str += 'b'; // 在str后追加一个字符'b'
str += "it"; // 在str后追加一个字符串"it"
cout<<str<<endl;
cout<<str.c_str()<<endl; // 以C语言的方式打印字符串
// 获取file的后缀
string file1("string.cpp");
size_t pos = file.rfind('.');
string suffix(file.substr(pos, file.size()-pos));
cout << suffix << endl; // npos是string里面的一个静态成员变量
// static const size_t npos = -1;
// 取出url中的域名
string url("http://www.cplusplus.com/reference/string/string/find/");
cout << url << endl;
size_t start = url.find("://");
if (start == string::npos)
{
cout << "invalid url" << endl;
return;
}
start += 3;
size_t finish = url.find('/', start);
string address = url.substr(start, finish - start);
cout << address << endl; // 删除url的协议前缀
pos = url.find("://");
url.erase(0, pos+3);
cout<<url<<endl; }
String类非成员函数
istream& operator>> (istream& is, string& str);//输入运算符重载
istream& operator<< (istream& is, string& str);//输出运算符重载
istream& getline (istream& is, string& str);//获取一行字符串