顺序容器---string详解

前言

博客编写人:Willam
博客编写时间:2017/3/21
博主邮箱:2930526477@qq.com(有志同道合之人,可以加qq交流交流编程心得)

1、string的介绍

string是以char作为模板参数的模板类实例,把字符串的内存管理责任由string负责而不是由编程者负责,大大减轻了C语言风格的字符串的麻烦。

2、string的头文件

#include<string>
using std::string;

3、string的常用的构造函数


 1. string()   //默认构造函数
 2. string(const string & s);// 拷贝构造函数
 3. string(const string & str,size_t pos,size_t len=nops) //substring
 4. string(const char* s);  //使用c风格的字符串进行赋值
 5. string(const char * s,size_t n);//前n个字符
 6. string(inputIterator first,inputIterator last);
 7. string (size_t n, char c);

Example:

#include <iostream>
#include<string>
using namespace std;


int main()
{
    string s0("A student");  //使用c风格
    string s1(s0);    //调用拷贝构造函数
    string s2(s0, 2, 3); //调用子串那个构造函数,从下标2开始,拷贝三个
    string s3("Another character sequence", 12);//取前12个字符
    string s4(10, 'x');    //10个x,
    string s5(s0.begin(),s0.end());//记住这个范围为左闭右开区间

    cout << s0 << endl;
    cout << s1 << endl;
    cout << s2 << endl;
    cout << s3 << endl;
    cout << s4 << endl;
    cout << s5 << endl;

    system("pause");
    return 0;
}

输出:

这里写图片描述

3、string的迭代器介绍

在这里先介绍一下,string中有4种类的迭代器类型:

  • iterator
  • const_iterator //c++ 11才有的东西
  • reverse_iterator
  • const_reverse_iterator //c++ 11才有的东西

如果不知道迭代器是什么,请参考:迭代器介绍

//迭代器begin(),返回的指向字符串第一个字符的迭代器,它的构造函数如下

 1. iterator begin() 
 2. const_iterator begin()

//只有我们的string类型是const类型时,才返回const_iterator,否则都返回iterator
//迭代器end(),返回指向字符串最后一个字符的下一个位置的迭代器,它的构造函数如下:

 1. iterator end() 
 2. const_iterator end()

//同样,只有我们的string类型是const类型时,才返回const_iterator,否则都返回iterator
//迭代器rbegin(),用于逆序读取串的内容,rbegin指向字符串最后一个字符,它的构造函数如下:

 1. reverse_iterator rbegin()
 2. const_reverse_iterator rbegin()

//同样,只有我们的string类型是const类型时,才返回const_reverse_iterator,否则都返回reverse_iterator
//迭代器rend(),用于逆序读取串的内容,rend()指向字符串第一个字符的前一个位置,它的构造函数如下:

 1. reverse_iterator rend()
 2. const_reverse_iterator rend()

//同样,只有我们的string类型是const类型时,才返回const_reverse_iterator,否则都返回reverse_iterator
//迭代器rend(),用于逆序读取串的内容,rend()指向字符串第一个字符的前一个位置,它的构造函数如下:

 1. reverse_iterator rend()
 2. const_reverse_iterator rend()

//同样,只有我们的string类型是const类型时,才返回const_reverse_iterator,否则都返回reverse_iterator
下面这些迭代器都是c++ 11才提出来的,他们返回的都是各自对应的迭代器常量。

 1. cbegin()   //对应begin,但是返回都是const_iterator
 2. cend()    //对应end,但是返回都是const_iterator
 3. crbegin()    //对应rbegin,但是返回都是const_reverse_iterator
 4. crend()    //对应rend,但是返回都是const_reverse_iterator

下面则是对迭代器的使用示例:

#include <iostream>
#include<string>
using namespace std;


int main()
{
    string s1 = "i am a student!";

    //首先是对begin和end的使用
    std::string::iterator start = s1.begin();
    std::string::iterator end = s1.end();  //这个是指向无意义地址空间
    //cout << *end << endl;  所以这里会出现异常
    //用迭代器遍历字符串。
    cout << "遍历字符串" << endl;
    while (start < end) {
        cout << *start;
        start = start + 1;
    }
    cout << endl;
    cout << "输出最后一个字符" << endl;
    cout << *(end - 1) << endl;


    cout << "逆序输出字符串" << endl;
    std::string::reverse_iterator rstart = s1.rbegin();
    std::string::reverse_iterator rend = s1.rend();
    while (rstart < rend) {
        cout << *rstart;
        rstart = rstart + 1;
    }
    cout << endl;
    //cout << *rend << endl; 这里会出现异常,因为它指向字符串第一个为的前一个位置


    cout << "s1的cbegin返回的类型:" << typeid(s1.cbegin()).name() << endl;
    const  string  s2 = "dsafsa";
    cout << "常量s2的begin返回的类型:" << typeid(s2.begin()).name() << endl;

    system("pause");
    return 0;
}

输出:
这里写图片描述

4、有关string的大小的操作函数


 1. size()    //返回字符串的长度(\0以前的子串个数)
 2. length()   //和size()一模一样
 3. empty()    //判断字符串的长度是否为0,不要用size和length判断,empty的效率更高
 4. max_size()   //返回string所能包含的最多的字符数
 5. resize()    //这个函数有两个版本,具体的介绍如下:
//void resize(size_type n, charT c)
//void resize(size_type n)
//改变string对象的内容为n个字符。
//如果n小于string对象的长度,内容被减少为前面的n个字符,后面的被清除。
//如果n大于string对象的长度,内容被附加需要的c字符以达到n个字符的长度。
//第二个函数实际调用resize(n, char()),如果n大于string对象的长度,新的字符位置填充char的默认值,null字符。
 6. capacity()    //返回需要重新分配内存前,string所能包含的最大字符数。(重新分配则会造成迭代器失效)
 7. reserve()   //修改capacity返回的值
 8. clear()     //清空字符串。
 9. shrink_to_fit()   //c++ 11新标准 释放size和capacity之前多余的空间,最后会capacity和size返回值相同

使用示例:

#include <iostream>
#include<string>
using namespace std;


int main()
{
    string s1 = "i am a student!";

    cout << "s1.size()=" << s1.size() << endl;
    cout << "s1.lenght()=" << s1.length() << endl;

    if (!s1.empty()) { cout << "s1不为空" << endl; }
    cout << "s1.max_size()=" << s1.max_size() << endl;
    cout << "s1.capacity()=" << s1.capacity() << endl;

    //通过resize,取s1的前三个字符
    s1.resize(3);
    cout << "取前三个字符:" << s1 << endl;
    s1.resize(5, 'n');
    cout << "末尾添加两个n:" << s1 << endl;

    //通过reserve修改capacity,而且记住capacity只会增大,不会减少,所以
    //如果reserve的参数小于size返回的值,则不会改变capacity返回的值
    //s1.reserve(10),为改变capacity返回的值
    s1.reserve(20);

   //注意capacity返回的值可能大于等于40,这个是reserve自己的机制决定的
    cout << "修改后s1.capacity()=" << s1.capacity() << endl;

    //使用shrink_to_fit来释放没有使用的空间
    s1.shrink_to_fit();
    cout << "释放没有使用的空间后的capacity" << s1.capacity() << endl;

    system("pause");
    return 0;
}

输出:
这里写图片描述

5、string元素的读取


 1. operator[]  //运算符重载,但是它不会检查下标是否溢出
 2. at()      //它是调用了下标运算符的,但是它会检查下标是否溢出
 3. back()     //返回字符串的最后一个字符
 4. front()   //返回字符串的第一个字符

代码示例:

#include <iostream>
#include<string>
using namespace std;


int main()
{
    string s1 = "i am a student!";
    cout << s1[0] << endl;
    cout << s1.at(2) << endl;
    cout << s1.front() << endl;
    cout << s1.back() << endl;

    system("pause");
    return 0;
}

输出:
这里写图片描述

6、改变string内容的函数或操作符


 1. operator+=    //在string串的尾部追加字符,可以是字符也可以是字符串(c风格和string对象都可以)
 2. append()       //在string串的尾部追加内容,它有很多种重载类型,和string构造函数相似。(可参考:(http://www.cplusplus.com/reference/string/string/append/))
 3. push_back()    //追加一个字符到字符串的末尾,参数为char
 4. assign()    //把字符串原来的内容全部更换为新的内容
 5. insert()    //插入一个字符或字符串到原来的字符中
 6. erase()    //删除字符串中内容
 7. replace()  //用字符或字符串替换原串的部分内容
 8. swap()     //交换两个字符串的内容
 9. pop_back()  //删除字符串最后一个元素

7、字符串的自己的操作函数


 1. c_str()  //原型为const char* c_str() ,返回的是const char *
 2. data()   //原型const char* data(),作用和c_str一样,但是它返回的是不以‘\0’结尾的字符串
 3. copy()     //原型size_t copy (char* s, size_t len, size_t pos = 0),取字符串中某段子串赋给s。
 4. find()  //查找字符或字符串是否在原串中
 5. rfind()  //同find函数,从字符串最后往前找字符或字符串
 6. find_first_of()//查找包含子串中的任何字符,返回第一个位置
 7. find_first_not_of()  // 查找不包含子串中的任何字符,返回第一个位置
 8. find_last_of()     //查找包含子串中的任何字符,返回最后一个位置
 9. find_last_not_of    //查找不包含子串中的任何字符,返回最后一个位置
 10. substr()    //返回子串,原型:string substr (size_t pos = 0, size_t len = npos)

8、string中npos介绍

//定义
static const size_type npos = -1;

//npos可以表示string的结束位子,是string::type_size 类型的,也就是find()返回的类型。find函数在找
//不到指定值得情况下会返回string::npos。

npos的介绍

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值