1. STL 简介
什么是 STL
STL 是 C++ 标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
STL 六大组件
2. 标准库中的 string 类
了解 string 类
string 是表示字符串的字符串类,该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作 string 的常规操作。string 在底层实际是:basic_string 模板类的别名,typedef basic_string<char> string。string 不能操作多字节或者变长字符的序列。
3. string 常用函数
string 它在 #include <string> 中,它有七个构造函数
string();
//构造一个空的
string(const string & str);
//拷贝构造
string(const string & str, size_t pos, size_t len = npos);
//拷贝 str 的一部分,从 pos 位置开始拷贝 len 个字符。如果 len 远超后面的长度就直接拷到 str 的 结尾。
//npos 是它里面的一个静态成员标量给的值是 -1 (static const size_t npos = -1)也就是一个号整型的最大值。
//所以这边 npos 的寓意就是取到结尾
string(const char* s);
//字符串初始化
string(const char* s, size_t n);
//用字符串的前 n 个去初始化对象
string(size_t n, char c);
//用 n 个字符去初始化
template <class InputIterator>
string(InputIterator first, InputIterator last);
//迭代器区间初始化
operator[]
[] 可以让一个类像数组一样去访问,并且它实现了两个重载版本,一个普通的和一个 const 的。
char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;
string str("Hello world");
cout << str[0] << endl;
str[0] = 'x';
cout << str[0] << endl;
迭代器
begin() 会返回第一个位置的迭代器,迭代器是一个像指针一样的东西,它有可能是指针也有可能不是,但是它的用法像指针。它是在 string 这个类里面有一个内嵌类型,然后这个类型定义一个对象,这个对象名字可以随便取一般都喜欢叫 it 。
string s("Hello world");
string::iterator it = s.begin(); //s.begin() 会返回第一个位置的迭代器
while (it != s.end()) //end 是最后一个位置的下一个位置
{
cout << *it << " "; //像指针一样的东西
++it;
}
cout << endl;
//反向迭代器
string::reverse_iterator rit = s.rbegin();
while (rit != s.rend())
{
cout << *it << ""; //
++it;
}
插入字符
push_back 只能插入字符,append 可以插入字符串。
void push_back (char c);
//
string& append (const string& str);
string& append (const string& str, size_t subpos, size_t sublen);
string& append (const char* s);
string& append (const char* s, size_t n);
string& append (size_t n, char c);
template <class InputIterator>
string& append (InputIterator first, InputIterator last);
string s("hello world");
s.push_back(' ');
s.push_back('-');
s.append("world");
同时它还重载了 +=
string& operator+= (const string& str);
string& operator+= (const char* s);
string& operator+= (char c);
string s("hello world");
string str("!!!");
s += '@';
s += str;
s += "???";
容量大小
string s("hello world");
cout << s.capacity() << endl;
申请空间
比如说知道要用 1000 个字符可以提前 reserve 1000
string s;
s.reserve(1000);
resize 是开空间 + 初始化
string s;
s.resize(1000, 'x');
清掉所有数据
string s;
s.clear();
插入
可以给下标也可以给迭代器
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 <class InputIterator>
void insert (iterator p, InputIterator first, InputIterator last);
string s("insert");
s.insert(s.end(), ' %');
删除
string& erase (size_t pos = 0, size_t len = npos);
iterator erase (iterator p);
iterator erase (iterator first, iterator last);
string s(" insert ");
s.erase(0, 1);
s.erase(s.end());
替换
replace 它可以把 pos 位置开始的 len 个字符直接替换成 str 对象或者 str 对象的一部分或者 char* 等
string& replace (size_t pos, size_t len, const string& str);
string& replace (iterator i1, iterator i2, const string& str);
string& replace (size_t pos, size_t len, const string& str,size_t subpos, size_t sublen);
string& replace (size_t pos, size_t len, const char* s);
string& replace (iterator i1, iterator i2, const char* s);
string& 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);
string& replace (size_t pos, size_t len, size_t n, char c);
string& replace (iterator i1, iterator i2, size_t n, char c);
template <class InputIterator>
string& replace (iterator i1, iterator i2,InputIterator first, InputIterator last);
c_str
它是用来兼容 C 的接口,它的返回值是一个 const char* 。c_str 是以 \0 为结尾的
const char* c_str() const;
查找
从 pos 位置开始找,返回第一个匹配的位置,没找到就返回 npos
size_t find (const string& str, size_t pos = 0) const;
size_t find (const char* s, size_t pos = 0) const;
size_t find (const char* s, size_t pos, size_t n) const;
size_t find (char c, size_t pos = 0) const;
取当前 string 的一个字串
从 pos 位置取 len 个字符
string substr (size_t pos = 0, size_t len = npos) const;
getline
getline 第一个参数就是传 cin 再传字符串,还可以传一个分隔符(用其它字符表示换行)。
istream& getline (istream& is, string& str, char delim);
istream& getline (istream& is, string& str);
string s;
getline(cin, s);