C++中的一些自带类——string、智能指针

C++中自带了一些常用的类,以下做部分介绍。

 

string类

string类是C++中的字符串类,区别于C的字符串,其更具有类的特点。
 

  1. string类与字符指针/C语言风格的字符串的不同
  2. string类的构造函数

    string类有7种不同参数列表的构造函数:
    string(const char *s)将string对象初始化为字符指针s指向的以空字符结束的字符串(null-terminated string,NBTS),实际是传统的C风格字符串。
    string(int n, char c)将string对象初始化为由n个字符c组成的字符串。
    string(const string &str)将string对象初始化为string类对象str
    string()创建一个默认string对象,长度为0。
    string(const char *s, int)将string对象初始化为NBTS的前n个字符组成的字符串
    template<class Iter>string(Iter begin, Iter end)将string对象初始化为迭代器(如指针)begin与end之间(包括begin不包括end)的字符串
    string(const string &str, int pos, intn)将string对象初始化为str从pos到结尾或从pos开始的n个字符的字符串
  3. 字符串输入

     · cin、getline()作为string对象的输入方法比较
    C风格字符串的输入与string类对象的输入有些不同,前者可以使用cin、cin.getline()、cin.get(),而后者只能使用cin、getline()。cin.getline()是istream类方法,而getline()则是string类自身的方法。

    示例代码如下:
    #include<iostream>
    #include<string>
    
    using namespace std;
    
    int main()
    {
    	string objStr;
    	cout<<"Please enter a string:"<<endl;
    	cin>>objStr;
    	cout<<"Here is the input string by using cin:"<<objStr<<endl;
    	while (cin.get()!='\n')//cin会把换行符留在缓冲区中,若不去去除则将成为getline()的值
    	{
    		continue;
    	}
    	cout<<"Now please enter a string:"<<endl;
    	getline(cin,objStr);
    	cout<<"Here is the input string by using getline():"<<objStr<<endl;
    
    	cin.get();
    	cin.get();
    	return 0;
    }
    

    getline()方法中的cin是作为参数的,并且其会把换行符从缓冲区中删除;cin中的cin则是调用对象,其会把换行符留在缓冲区中。

  4. string类的方法

    string类包含有许多实用的成员函数,例如find()、find_first_of()、find_last_of()等。

    以下介绍各类方法。其他方法的重载特征标同find()。

    · find()
    find()具有以下重载:
    int find(const string &str, int pos=0) const从字符串对象的pos位置开始查找子串str的位置,若找到则返回该子串首字母首次出现的位置索引;若找不到则返回string::npos(即字符串可储存的最大字符数)
    int find(const char *s, int pos=0) const从字符串对象的pos位置开始查找子串s的位置,若找到则返回该子串首字母首次出现的位置索引;若找不到则返回string::npos(即字符串可储存的最大字符数)
    int find(const char *s, int pos=0,int n) const从字符串对象的pos位置开始,查找字符串s前n个字符组成的子串的位置,若找到则返回该子串首字母首次出现的位置索引;若找不到则返回string::npos(即字符串可储存的最大字符数)
    int find(char ch, int pos=0) const从字符串对象的pos位置开始,查找字符ch,若找到则返回该字符首次出现的索引;若找不到则返回string::npos(即字符串可储存的最大字符数)

    · find_first_of()
    该函数用于寻找子串str中的任意字符在string对象中首次出现的位置,如hahhah在hand中的索引即为0,其调用语句为:
    string hand=string("hand");
    hand.find_first_of("hahhah")

    · find_last_of()
    该函数用于寻找子串str中的任意字符在string对象中最后出现的位置,如hahhah在hand中的索引即为1。

     
    · find_first_not_of()
    该函数用于寻找string对象中不出现在子串str的字符的首次出现的位置,如以下代码的结果是2,n为不在hahhah中:

    string hand=string("hand");
    hand.find_first_not_of("hahhah")

    · find_last_not_of()
    该函数用于寻找string对象中不出现在子串str的字符的最后出现的位置。

智能指针

C++11提供了智能指针这一新特性来解决动态内存管理的问题,智能指针有auto_ptr、unique_ptr、shared_ptr三种,这些指针过期时,它们将自动调用析构函数使用delete来释放内存。它们均包含在头文件memory中。

  1. auto_ptr、unique_ptr、shared_ptr的不同


    · 释放内存的策略
    使用动态内存分配时,当指针均指向同一个对象,可能使得同一个动态内存被释放两次,这样会报错。auto_ptr、unique_ptr、shared_ptr三种智能指针使用了不同的策略:

    #auto_ptr、unique_ptr采取的策略是所有权(ownership)策略,只有拥有所有权的智能指针才能访问、delete对象。但是unique_ptr比auto_ptr更智能,因为它能够在写代码时提醒使用者将一个unique_ptr对象A赋给另一个unique_ptr对象B是非法的,从而避免在后续运行时发生无法访问B的问题。auto_ptr是被C++11舍弃的。

    #shared_ptr采取的是引用计数策略,即跟踪引用特定对象的智能指针数,当最后一个指针过期时才允许delete对象。

    · new、new []
    #auto_ptr、shared_ptr使用的是delete来释放动态内存,故只有使用new时才能使用auto_ptr、shared_ptr。


    #unique_ptr使用delete或者delete []释放动态内存,故使用hew或new []时都能使用
     
  2. 智能指针的使用

    智能指针的使用代码如下:
    /*声明智能指针对象:
    智能指针类型<类型> 指针名(new 类的构造函数)
    */
    
    //示例
    
    int main()
    {
    	auto_ptr<string> aptr(new string("HH"));
    	cout<<*aptr;
    
    	cin.get();
    	return 0;
    }
    
    -----输出-----
    HH
  3. 智能指针的选择

    #在可以使用unique_ptr时,应尽量避免使用auto_ptr,因为它不是那么好。
    #当使用了new时,应使用shared_ptr,其适用于需要使用多个指针指向同一对象的场景,包括:用于寻找数组种的最大/最小元素、指向一个被两个对象同时包含的对象、包含指针的STL容器等。
    #当使用了new []时,应使用unique_ptr
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值