顺序容器---string详解

来源:互联网 发布:医院耗材管理软件 源码 编辑:程序博客网 时间:2024/04/29 23:57

前言

博客编写人: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的介绍

0 0
原创粉丝点击