c++里的string类

本博客依据《c++ Primer Plus (第6版)中文版 》而写。

c++里的string类是对字符串的处理,比c语言的字符串处理好用得多。

string对字符串的处理是对字符串进行类似常量化处理。也就是说,我们可以将一个字符串当成一个常数/常量来进行处理。

首先,使用string必须包含头文件   #include <string>   还要使用命名空间  using namespace std;

基本操作:

         1.构造string(构造字符串)

         ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

         构造函数                                                       |                    描述

         ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

         string(const char *s)                                     |         将string对象初始化为s指向的NBTS

         ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

         string(size_type n , char c)                           |     创建一个包含n个元素的string对象,其中每个对象都被初始化为字符c

        -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

        string(const string & str)                                |    将一个string对象初始化为string对象str(复制构造函数)

        -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

        string()                                                          |   创建一个默认的string对象,长度为0(默认构造函数)

        -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

         string(const char *s , size_type n)               |   将string对象初始化为s指向的NBTS的前n个字符,即使超过了NBTS结尾

        ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

        template<class Iter>                                     |    将string对象初始化为区间[ begin , end)内的字符,其中begin和end的行为就像指针

         string(Iter begin , Iter end)                           |     ,用于指定特定位置,范围包括begin在内,但不包括end

       -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

       string(const string &str , string size_type pos = 0,size_type n = npos)   |   将一个string对象初始化为对象str中从位置pos开始到结尾

                                                                                                                     |    的字符,或从位置pos开始的n个字符

       -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

       string (string && str) noexcept                     |   这是c++11新增的,它将一个string对象初始化为string对象str,并可能修改str(移动

                                                                           |   构造函数)

       -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

       string(initializer_list<char> il                        |   这是c++11新增的,它将一个string对象初始化列表il中的字符

       -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

int main()
{
    string one("Lottery Winner!");
    cout << one << endl;
    //构建一个叫 one 的字符串,并将它初始化为"Lottery Winner!"
    string two(30,'$');
    cout << two << endl;
    //构建一个叫 two 的字符串,并将它初始化为由30个$字符组成的字符串
    string three(one);
    cout << three << endl;
    //复制构造函数将string对象three初始化为string 对象 one
    one += " Oops!";
    cout << one << endl;
    //在字符串 one 后面加上"Oops!"(本质是重载了“+=”)
    two = "Sorry! That was ";
    three[0] = 'p';
    string four;
    four = two + three;
    cout << four << endl;
    //将"Sorry! That was "赋给字符串two,将three的第一个字符改为'p',将two 和three的内容加起来赋给字符串four
    char alls[] = "All's well that ends well";
    string five(alls,20);
    cout << five << "!\n";
    //将alls的前20个字符赋给five
    string six(alls + 6,alls + 10);
    cout << six << ", ";
    //将alls的从第6个字符开始到第10个字符的内容赋给six
    string seven(&five[6],&five[10]);
    cout << seven << "...\n";
    //将alls的从第6个字符开始到第10个字符的内容赋给seven
    string eight(four,7,16); cout << eight << " in motion!" << endl;
    //将four的从第7个字符开始到第16个字符的内容赋给eight
    return 0;
}

                                                                                                                                             2.字符串的输入:

            (1.)  对于C语言版的输入:

                            char s1[100];

                      输入方式有3种 

                        a.    cin>>s1;       只能读一个word。也就是说遇到空格或者 ‘ \n ’ 就停止了

                        b.    cin.getline(s1,100);   遇到 ' \n ' 停止,可以输入空格,但不包含  ' \n ' 

                        c.    cin.get(s1,100);      遇到 ' \n ' 停止,但是最后包含 ' \n '

              (2.)    对于string的输入:

                       string s2;

                    输入方式有2种:

                        a.  cin>>s2;       只能读一个word

                        b.  getline(cin,s2);   遇到 ' \n ' 停止

             对于2个版本的getline()输入,都有一种可输入可选参数的方式,用于指定使用那个字符来确定输入的边界:

             cin.getline(s1,100,'#');      表示遇到#号就停止

             getline(s2,'#');                同上

          2个版本在功能上的主要区别的,string版本的getline()将自动调整目标string对象的大小,使之刚好能够存储输入的字符,简而言之,就是                 string字符串的长度是依据你输入的字符串的长度而定的,你输入多长的字符串它就是多长的长度。而C语言版的是有固定长度的,比如这个例子           的长度是100。   但是string类的输入长度不是无限制的,输入的最大限制是 unsigned int的最大值

         string也可以直接比较大小:

         s1 == s2;  s1 > s2; s1 < s2;      

         

       对于string类,下面来个例题:

         字符串的冒泡排序   (20分)

我们已经知道了将NNN个整数按从小到大排序的冒泡排序法。本题要求将此方法用于字符串序列,并对任意给定的KKK<N<N<N),输出扫描完第KKK遍后的中间结果序列。

输入格式:

输入在第1行中给出NNNKKK1≤K<N≤1001\le K<N\le 1001K<N100),此后NNN行,每行包含一个长度不超过10的、仅由小写英文字母组成的非空字符串。

输出格式:

输出冒泡排序法扫描完第KKK遍后的中间结果序列,每行包含一个字符串。

输入样例:

6 2
best
cat
east
a
free
day

输出样例:

best
a
cat
day
east
free

 pat上面的题:如果用string类做,非常简单。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;
int main(int argc, char *argv[]) {
	string s[101];
	int n,k;
	scanf("%d%d",&n,&k);
	for(int i = 1; i <= n; ++i){
		cin>>s[i];
	}
	for(int i = 1; i <= n; ++i){
		if(k == 0) break;
		k--;
		for(int j = 1; j <= n-i; ++j){
			string tmp;
			if(s[j] > s[j+1]){
				tmp = s[j];
				s[j] = s[j+1];
				s[j+1] = tmp;
			}
		}
	}
	for(int i = 1; i <= n; ++i){
		cout<<s[i]<<endl;
	}
	return 0;
}





猜你喜欢

转载自blog.csdn.net/shengsikandan/article/details/50973883