zoukankan      html  css  js  c++  java
  • string类------新标准c++程序设计

    定义:

      string类是STL中basic_string模板实例化得到的模板类。其定义如下:

    typedef basic_string<char>string;

    构造函数: 

      string类有多个构造函数,但没有接收一个整型参数或一个字符型参数的构造函数

    string s1();                                   //s1=""
    string s2("hello");                            //s2="hello"
    string s3(4,'k');                              //s3="kkkk"
    string s4("12345",1,3);                       //s4="234"  即“12345”的从下标1开始,长度为3的子串

    string s5('k'); //非法错的
    string s6(123); //非法错的

    赋值函数:

      可以用char*类型的变量、常量,以及char类型的变量、常量对string对象进行赋值。例如:

    string s1;
    s1="hello";         //s1="hello"
    s2='k';               //s2="k"

    char a[5]="1234";
    s3=a; //s3="1234"

      string类还有assign成员函数,可以用来对string对象赋值。assign成员函数返回对象自身的引用。例如:

    string s1("12345"),s2;
    s3.assign(s1);                       //s3=s1
    s2.assign(s1,1,2);                   //s2="23",即s1的子串(1,2)
    s2.assign(4,'k');                   //s2="kkkk"
    s2.assign("abcde",2,3);             //s2="cde",即“abcde”的子串(2,3)
    
    s2.assign("12345").assign("678");   //返回对自身的引用,可以继续在后面调用assign成员函数 s2="678"                                         

     求字符串长度:

      length成员函数返回字符串的长度。size成员函数可以实现同样的功能。

    返回char类型字符串: 

    string x=“123”;
    x.c_str();               // “123”

    string对象中字符串的连接:

      可以使用“+”和“+=”运算符对string对象执行字符串的连接操作,string类还有append成员函数,也可以用来向字符串后面添加内容。append成员函数返回对象自身的引用。例如:

    string s1("123"),s2("abc");
    s1.append(s2);                            //s1="123abc"
    s1.append(s2,1,2);                       //s1="123abcbc"
    s1.append(3,'k');                        //s1="123abcbckkk"
    s1.append("ABCDE",2,3);                 //s1="123abcbckkkCDE",添加“ABCDE“子串(2,3)

    string对象的比较:

      可以用“<”、"<="、"=="、、“!=”、">="、">"运算符比较string对象。string类还有compare成员函数,可以用来比较字符串.compare成员函数有以下返回值:小于0表示当前的字符串小;等于0表示两个字符串相等;大于0表示另一个字符串小。例如:

    string s1("hello"),s2("hello,world");
    int n=s1.compare(s2);
    n=s1.compare(1,2,s2,0,3);               //比较s1的子串(1,2)和s2的子串(0,3)
    n=s1.compare(0,2,s2);                   //比较s1的子串(0,2)和s2
    n=s1.compare("Hello"); 
    n=s1.compare(1,2,"Hello");              //比较s1的子串(1,2)和"Hello"
    n=s1.compare(1,2,"Hello",1,2);          //比较s1的子串(1,2)和“Hello”的子串(1,2)

    求string对象的子串:

      substr成员函数可以用来求子串(n,m)原型如下:

    string substr(int n=0,int m=string::npos)const
    

      调用时,如果省略m或m超过了字符串的长度,则求出来的子串就是从下标n开始一直到字符串结束的部分。例如:

    string s1="this is ok";
    string s2=s1.substr(2,4);                   //s2="is i"
    s2=s1.substr(2);                            //s2="is is ok"

    交换两个string对象的内容:

      swap成员函数可以交换两个dtring对象的内容。例如:

    string s1("west"),s2("east");
    s1.swap(s2);                                 //s1="east"  s2="west"
    

    查找子串和字符:

      string类有6种查找子串和字符的成员函数,每种函数以不同形式的 find 命名。它们的返回值都是子串或字符在string对象字符串中的位置(即下标   string::size_type 类型的值)。如果查不到,则返回string::npos。string::npos是在string类中定义的一个静态常量。string::nops  原意  no position(无位置),是 unsigned int的最大值 UINT_MAX=4294967295 ,即查找到最后位置也没有匹配。在int 下数值刚好为-1, 也可以理解为 返回不存在的下标。

      这些函数如下:

      find:从前往后查找子串或字符出现的位置。

      rfind:从后往前查找子串或字符出现的位置。

      find_first_of:从前往后查找何处出现另一个字符串中包含的字符。例如:

    s1.find_first_of("abc");   //查找s1zhong第一次出现“abc”中任一字符的位置

      find_last_of:从后往前查找何处出现另一个字符串中包含的字符。

      find_first_not_of:从前往后查找何处出现另一个字符串中没有包含的字符。

      find_last_not_of:从后往前查找何处出现另一个字符串中没有包含的字符。

      下面是string类的查找成员函数的示例程序:

    #include<iostream>
    #include<string>
    using namespace std;
    int main(){
      string s1("Source Code");
      int n;
      if((n=s1.find('u'))!=string::npos)                                //查找u出现的位置
      cout<<"1)"<<n<<","<<s1.substr(n)<<endl;              //输出 1)2,urce Code
    
      if(n=s1.find("Source",3)==string::npos)                   //从下表3开始查找"Source",找不到
      cout<<"2)"<<"Not Found"<<endl;                           //输出 2)Not Found
    
      if((n=s1.find("Co"))!=string::npos)                           //查找子串"Co"。能找到,返回"Co"的位置
      cout<<"3)"<<n<<","<<s1.substr(n)<<endl;             //输出 3)7,Code
    
      if((n=s1.find_first_of("ceo"))!=string::npos)            //查找第一次出现"c"、'e'或'0'的位置
      cout<<"4)"<<n<<","<<s1.substr(n)<<endl;          //输出 4)1,ource Code
    
      if((n=s1.find_last_of('e'))!=string::npos)                 //查找最后一个'e'的位置
      cout<<"5)"<<n<<","<<s1.substr(n)<<endl;            //输出 5)10,e
    
      if((n=s1.find_first_not_of("eou",1))!=string::npos) //从下标1开始查找第一次出现非'e','o'或‘u’字符的位置
      cout<<"6)"<<n<<","<<s1.substr(n)<<endl;            //输出 6)3,rec Code
    
      return 0;
    }
    

      

    替换子串:

      replace成员函数可以对string对象中的子串进行替换,返回值为对象自身的引用。例如:

    string s1("Real Steel");
    s1.replace(1,3,"123456",2,4);        //用“123456”的子串(2,4)替换s1的子串(1,3)
    cout<<s1<<endl;                      //输出  R3456 Steel 
    string s2("Harry Potter");
    s2.replace(2,3,5,'0');               //用5个'0'替换子串(2,3)
    cout<<s2<<endl;                      //输出  Ha00000 Potter
    int n=s2.find("00000");              //查找子串“00000”的位置,n=2
    s2.replace(n,5,"XXX");               //将子串(n,5)替换为“XXX”
    cout<<s2<<endl;                      //输出 HaXXX Potter
    

    删除子串:

      erase成员函数可以删除string对象中的子串,返回值为对象自身的引用。例如:

    string s1("Real Steel");
    s1.erase(1,3);                      //删除子串(1,3),此后s1=“R Steel”
    s1.erase(5);                        //删除下标5及其后面的所有字符。此后s1=“R Ste”
    

    插入字符串:

      insert成员函数可以在string对象中插入另一个字符串,返回值为对象自身的引用。例如:

    string s1("Limitless"),s2("00");
    s1.insert(2,"123");                  //在下标2处插入字符串“123”,s1="Lil123mitless“
    s1.insert(3,s2);                     //在下标2处插入s2,s1="Lil0023mitless"
    s1.insert(3,5,'x');                   //在下标3处插入5个'x',s1=”Li1xxxxx0023mitless”

    将string对象作为流处理:

      使用流对象istringstream和ostringstream,可以将string对象当作一个流进行输入输出。这两个类需要包含头文件sstream。示例程序如下:

    #include <iostream>
    #include <sstream>
    #include <string>
    using namespace std;
    int main(){
      string src("Avatar 123 5.2 Titanic K");
      istringstream istrStream(src);                   //建立src到istrStream的联系
      string s1, s2;
      int n;  double d;  char c;
      istrStream >> s1 >> n >> d >> s2 >> c;           //把src的内容当做输入流进行读取
      ostringstream ostrStream;
      ostrStream << s1 << endl << s2 << endl << n << endl << d << endl << c <<endl;
      cout << ostrStream.str();
      return 0;
    }

      该程序的输出结果是:

    Avatar
    Titanic
    123
    5.2
    K
    

      第十一行,从输入流istrStream进行读取,过程和从cin读取一样。

      第十二行,将变量的值输出到流ostrStream。输出结果并不会出现在屏幕上,而是被保存在ostrStream对象管理的某处。用ostringstream类的str成员函数能将输出到ostringstream对象中的内容提取出来。

    用STL算法操作string对象:

      string对象也可以看作一个顺序容器,它支持随机访问迭代器,也有begin和end等成员函数。STL中的许多算法也适用于string对象。下面是STl算法操作string对象的程序示例:

    #include<iostream>
    #include<algorithm>
    #include<string>
    using namespace std;
    int main(){
        string s("afgcbed");
        string::iterator p=find(s.begin(),s.end(),'c');
        if(p!=s.end())
            cout<<p-s.begin()<<endl;                  //输出3
        sort(s.begin(),s.end());
        cout<<s<<endl;                                //输出abcdefg
        next_permutation(s.begin(),s.end());
        cout<<s<<endl;                                //输出abcdegf
        return 0;
    }

    注意:

      1、string与字符数组不同的是,一个string对象的大小是固定的,即表达式sizeof(string)的值是固定的,和其中存放的字符串的长度无关。但这个固定的值在不同编译器中不相同。例如,在Dev C++中是4,在vs2010中是32,string对象中并不直接存放字符串,字符串会在别处开辟内存空间存放,string对象值存放该空间的地址,或者再加上其他一些信息。

      2、用普通字符对string对象赋值,普通字符串的内容会被复制到string对象所管理的那片内存空间中。

      3、string对象在比较大小时是按词典序比较的,而且是大小写相关的。由于大写字母的ASCII码小于小写字母的ASCII码(‘A’~‘Z’的ASCII码是0x41~0x5a,‘a’~‘z’的ASCII码是0x61~0x7a),所以Zbc比abc小。

    转载请注明出处:http://www.cnblogs.com/goudanli/p/7664213.html

    新标准c++程序设计

  • 相关阅读:
    SD卡测试
    测试人员可能会遇到的问题
    HDU 1024 Max Sum Plus Plus
    HDU 1176 免费馅饼
    HDU 1257 最少拦截系统
    HDU 1087 Super Jumping! Jumping! Jumping!
    poj 1328 Radar Installation
    poj 1753 Flip Game
    HDU 1003 Max Sum
    HDU 5592 ZYB's Premutation(BestCoder Round #65 C)
  • 原文地址:https://www.cnblogs.com/l2017/p/7664213.html
Copyright © 2011-2022 走看看