知识点:
- 标准 C++ string 类。
- 模板 auto_ptr、unique_ptr和shared_ptr。
- 标准模板库(STL)。
1. string 类
// string 类的构造函数 string(const char*s) string(size_type n, char c) string(const string &str) // 复制构造函数 string() // 默认构造函数 string(const char* s, size_type n) // 将String 对象初始化为s 指向的字符串的前n 个字符,即使超过了字符串的结尾 template<class Iter> string(Iter begin, Iter end) // 将String 对象初始化为区间[begin, end)内的字符 string(const string & str, string size_type pos = 0, size_type n = npos) // 将String 对象初始化为对象 str中从位置pos开始到结尾的字符,或从位置pos开始的n个字符 string(string && str)noexcept string(initializer_list<char> il) //常用成员函数 str.size() str.length() // 返回字符串的字符数 find() // 在字符串中搜索给定的子字符串或字符 1.size_type find(const string &str, size_type pos = 0)const // 从字符串的pos位置开始,找str子字符串.返回第一次出现的位置或者string::npos 2.size_type find(const char *s, size_type pos = 0)const // 从字符串的pos位置开始,找子字符串s.返回第一次出现的位置或者string::npos 3.size_type find(const char ch, size_type pos = 0)const // 从字符串的pos位置开始,找字符ch.返回第一次出现的位置或者string::npos 4.size_type find(const char *s, size_type pos = 0, size_type n)const // 从字符串的pos位置开始,找字符串s的前n个字符组成的子字符串.返回第一次出现的位置或者string::npos rfind() // 查找最后一次出现的位置 find_first_of() // 寻找参数中任意一个字符首次出现的位置 如:str = "cobra" int where = str.find_first_of("hark") 则返回r在str中的位置 find_last_of() // 寻找参数中任意一个字符最后一次出现的位置 find_first_not_of() // 同理 find_last_not_of() capacity() and reserve() 由于字符串存储的相邻内存可能已经被占用了,因此在扩大字符串时可能需要分配一个新的内存块并将原来的内容复制到新的内存单元中。 因此很多c++实现分配一个比实际字符串大的内存空间,如果字符串不断增大,超过了内存块大小,将分配一个原来大小两倍的新内存。 //字符串的第一个字符 string::const_iterator it = str1.begin(); cout << *it << endl; // 倒置字符串 reverse(str1.begin(), str1.end()); //取一个元素 cout<<str1.at(1)<<endl; 注:operator[]和at()均返回当前字符串中第n个字符的位置,但at函数提供范围检查,当越界时会抛出out_of_range异常,下标运算符[]不提供检查访问 //string的子串: string substr(int pos = 0,int n = npos) const;//返回pos开始的n个字符组成的字符串 // string的赋值: string &assign(int n,char c);//用n个字符c赋值给当前字符串 string &assign(const string &s,int start,int n);//把字符串s中从start开始的n个字符赋给当前字符串 string &assign(const_iterator first,const_itertor last);//把first和last迭代器之间的部分赋给字符串 // string的连接: string &append(const char *s); //把c类型字符串s连接到当前字符串结尾 string &append(const char *s,int n);//把c类型字符串s的前n个字符连接到当前字符串结尾 string &append(const string &s,int pos,int n);//把字符串s中从pos开始的n个字符连接到当前字符串的结尾 string &append(int n,char c); //在当前字符串结尾添加n个字符c string &append(const_iterator first,const_iterator last);//把迭代器first和last之间的部分连接到当前字符串的结尾
2. 智能指针模板类(atuo_ptr、unique_ptr和shared_ptr)
要创建智能指针对象,必须包含头文件 memory。
这三种智能指针模板(atuo_ptr、unique_ptr和shared_ptr)都定义了类似指针的对象,可以将new获得的地址赋给这种对象。
优点:在智能指针过期时,这些内存将自动被释放(不用手动delete)。
图解:
//构造函数 auto_ptr<double> pd(new double); auto_ptr<string> ps(new string); //unique_ptr、shared_ptr同理 #include<iostream> #include<string> #include<memory> using namespace std; class Report { private: string str; public: Report(const string s) : str(s) // 构造函数 { cout << "Object created!\n"; } ~Report() { cout << "Object deleted! \n"; } // 析构函数 void comment() const { cout << str << "\n"; } }; int main() { { auto_ptr<Report> ps(new Report("using auto_ptr")); ps->comment(); } // 自动delete unique_ptr<Report> pe(new Report("using unique_ptr")); pe->comment(); return 0; } 输出: Object created! using auto_ptr Object deleted! Object created! using unique_ptr Object deleted! shared_ptr<double> pd; double *p = new double; pd = p; // 不允许 pd = shared_ptr<double>(p); // 允许 shared_ptr<double> pshared = p; // 不允许 shared_ptr<double> pshared(p); // 允许
未来避免两个智能指针指向同一块内存,导致重复删除,三种智能指针采用两种方法:
auto_ptr、unique_ptr: 建立所有权的概念,只有一个智能指针拥有内存的所有权,但unique_ptr的策略更加严格;
shared_ptr: 创建计数指针,称为引用计数。当一块内存的智能指针数为1时,此时才会delete掉这块内存。
智能指针的选用:
当程序要使用多个指向同一个对象的指针时,应选择shared_ptr,反之选择unique_ptr。