C++ 的标准string类操作整理

1,定义和构造初始化
    String类的构造函数和析构函数如下:
a) string s;      //生成一个空字符串s
b) string s(str) ;     //拷贝构造函数 生成str的复制品
c) string s(str, stridx);     //将字符串str内“始于位置stridx”的部分当作字符串的初值
d) string s(str, stridx, strlen) ;    //将字符串str内“始于stridx且长度顶多strlen”的部分作为字符串的初值
e) string s(cstr);     //将C字符串作为s的初值
f) string s(chars, chars_len);     //将C字符串前chars_len个字符作为字符串s的初值。
g) string s(num, c);     //生成一个字符串,包含num个c字符
h) string s(beg, end);     //以区间beg;end(不包含end)内的字符作为字符串s的初值
i) s.~string() ;    //销毁所有字符,释放内存
测试如下:
#include <iostream>
#include <string>
using namespace std;

int main()
{
	string str1 = "yesterday once more";
	string str2("my heart go on");
	string str3(str1, 6);  // = day once more
	string str4(str1, 6, 3);  // = day

	char ch_music[] = { "Roly-Poly" };

	string str5 = ch_music; // = Roly-Poly
	string str6(ch_music); // = Roly-Poly
	string str7(ch_music, 4); // = Roly
	string str8(10, 'i');  // = iiiiiiii
	string str9(ch_music + 5, ch_music + 9); // = Poly

	str9.~string();

	getchar();
	return 0;
}

2 ,字符串的操作函数
    (1)=, assign()    // 赋以新值

        assign() 的用法如下:

int main()
{
	string str1 = "yesterday once more";
	string str2("my heart go on");
	
	string str3, str4;

	str3.assign(str2, 3, 7);  // = heart g
	str4.assign(str2, 3, string::npos); // = heart go on (从3开始到结尾赋值给str4)
	str4.assign("gaint");  //= gaint
	str4.assign("nico", 500); // = nico  超出的长度会出现乱码
	str4.assign(5, 'x'); // = xxxxx

	cout << str4 << endl;

	getchar();
	return 0;
}

     (2)swap()   //交换两个字符串的内容
        用法如下:
int main()
{
	string str1 = "yesterday once more";
	string str2("my heart go on");
	
	str2.swap(str1);

	cout << str1 << endl; // = my heart go on
	cout << str2 << endl; // = yesterday once more

	getchar();
	return 0;
}

       (3)+=, append(),push_back()       //在尾部添加字符
            增加字符(这里说的增加是在尾巴上),函数有+=,append(),push_back()。 举例如下:
   
int main()
{
	string str1 = "yesterday once more";
	string str2(" my heart go on");
	
	str1 += str2;
	cout << str1 << endl;

	str1 += 'a';
	cout << str1 << endl;
	
	str1.append(str2, 1, 3);
	cout << str1 << endl;

	str1.append(str2, 2, string::npos);
	cout << str1 << endl;

	str1.append("my name is zyx");
	cout << str1 << endl;

	str1.append("nico", 500);
	cout << str1 << endl;

	str1.append(5, 'x');
	cout << str1 << endl;

	str1.push_back('z'); //这个函数只能增加单个字符
	cout << str1 << endl;
	 
	
	getchar();
	return 0;
}
    (4)insert()  //插入字符
    在string中间的某个位置插入字符串,可以用insert()函数,在这个函数需要指定一个安插位置的索引,被插入的字符串将放在这个索引的后面。 举例如下:
 
 
int main(){string str1 = "yesterday once more";string str2(" my heart go on");str1.insert(0, "my name");cout << str1 << endl;str1.insert(1, str2);cout << str1 << endl;getchar();return 0;}

    (5)erase()  // 删除字符
int main()
{
	string str1 = "yesterday once more";
	string str2(" my heart go on");
	
	str1.erase(10);
	cout << str1 << endl;

	str1.erase(5, 4);
	cout << str1 << endl;

	getchar();
	return 0;
}

    (6)clear()   // 删除全部字符

    (7)replace()  //替换字符
int main()
{
	string str1 = "yesterday once more";
	string str2(" my heart go on");
	
	str1.replace(0, 2, "my name ");
	cout << str1 << endl;

	getchar();
	return 0;
}

    (8)+  //串联字符串
    (9)==, !=, <, <=, >=, compare()  //比较字符串

     另一个功能强大的比较函数是成员函数compare()。他支持多参数处理,支持用索引值和长度定位子串来进行比较。他返回一个整数来表示比较结果,返回值意义如下:0-相等 >0-大于 <0-小于

string s(“abcd”); 
s.compare(“abcd”); //返回0 
s.compare(“dcba”); //返回一个小于0的值 
s.compare(“ab”); //返回大于0的值 
s.compare(s); //相等 
s.compare(0,2,s,2,2); //用s的”ab”和 s的”cd”进行比较小于零 
s.compare(1,2,”bcx”,2); //用”bc”和”bc”比较。 (将s中从pos1开始的n1个字符与指针cp指向的地址开始的n2个字符进行比较)

   (10)size(),length() //返回字符数量
                现有的字符数,函数是size()和length(),他们等效。
    (11) max_size() //返回字符的可能最大个数???
             max_size() 这个大小是指当前C++字符串最多能包含的字符数,很可能和机器本身的限制或者字符串所在位置连续内存的大小有关系。我们一般情况下不用关心他,应该大小足够我们用的。但是不够用的话,会抛出length_error异常
      (12)empty() //判断字符串是否为空
                Empty()用来检查字符串是否为空。
      (13) capacity() //返回重新分配之前的字符容量
                capacity()重新分配内存之前 string所能包含的最大字符数。
      (14)reserve() //保留一定量内存以容纳一定数量的字符
                这个函数为string重新分配内存。重新分配的大小由其参数决定,默认参数为0,这时候会对string进行非强制性缩减。
      (15) [ ], at() //存取单一字符
                可以使用下标操作符[]和函数at()对元素包含的字符进行访问。但是应该注意的是操作符[]并不检查索引是否有效(有效索引0~str.length()),如果索引失效,会引起未定义的行为。而at()会检查,如果使用 at()的时候索引无效,会抛出out_of_range异常。

   string str1 = "Iphone 5";
   cout<<str1[2]<<endl; // = h
   cout<<str1.at(4)<<endl; // = n

    string stuff;
    getline(cin,stuff); // 输入一行字符赋值给stuff
    getline(cin,stuff,'!'); // 输入一行字符以“!”结束
    cout<<stuff<<endl;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

    (16) >>,getline() //从stream读取某值
    (17) << //将谋值写入stream
    (18) copy() //将某值赋值为一个C_string
                c_str() //将内容以C_string返回
                data() //将内容以字符数组形式返回
                C++提供的由C++字符串得到对应的C_string的方法是使用data()、c_str()和copy(),其中,data()以字符数组的形式返回字符串内容,但并不添加’\0’。c_str()返回一个以‘\0’结尾的字符数组,而copy()则把字符串的内容复制或写入既有的c_string或字符数组内。C++字符串并不以’\0’结尾。我的建议是在程序中能使用C++字符串就使用,除非万不得已不选用c_string。
     (19) substr() //返回某个子字符串
                substr(),形式如下:
                s.substr();//返回s的全部内容
                s.substr(11);//从索引11往后的子串
                s.substr(5,6);//从索引5开始6个字符
    (20) 查找函数
            查找函数很多,功能也很强大,包括了:
            find()
            rfind()
            find_first_of()
            find_last_of()
            find_first_not_of()
            find_last_not_of()
            这些函数返回符合搜索条件的字符区间内的第一个字符的索引,没找到目标就返回npos。所有的函数的参数说明如下:
         第一个参数是被搜寻的对象。第二个参数(可有可无)指出string内的搜寻起点索引,第三个参数(可有可无)指出搜寻的字符个数。比较简单,不多说不理解的可以向我提出,我再仔细的解答。当然,更加强大的STL搜寻在后面会有提及。
最后再说说npos的含义,string::npos的类型是string::size_type,所以,一旦需要把一个索引与npos相比,这个索引值必须是string::size)type类型的,更多的情况下,我们可以直接把函数和npos进行比较(如:if(s.find(“jia”)== string::npos))。
  
int main()
{
    string str = "when i was young, i listen to radio.";
    string::size_type position;

    position  = str.find("listen");

    if (position != str.npos) //npos是个很大的数,如果没找到就会返回npos的值给position
    {
        cout<<"第一次出现的下标是:"<<position<<endl;
    }

    //从字符串下标9开始,查找字符串you,返回you 在str中的下标
    position = str.find("you",9);
    cout<<"str.find("you",9")is:"<<position<<endl;

    //查找子串出现的所有位置
    string substr = "i";
    position = 0;
    int i = 1;
    while((position = str.find_first_of(substr,position)) != string::npos)
    {
        cout<<"position "<<i++<<position<<endl;
        position++;
    }

    //反向查找子串在str中最后出现的位置
    string flag = "to";
    position = str.rfind(flag);
    cout<<"str.rfind(flag):"<<position<<endl;
    getchar();
    return 0;
}

    (21)begin(),end()   //提供类似STL的迭代器支持
int main()
{
    string str;

    str.push_back('Q');
    str.push_back('A');

    sort(str.begin(),str.end());
    string::iterator itstr = str.begin();

    for ( ; itstr != str.end(); itstr++)
    {
        cout<<*itstr;
    }   

    //str.pop_back();

    getchar();
    return 0;   //输出AQ
}

    (22)rbegin()  rend()    //逆向迭代器
    (23)get_allocator()    //返回配置器

猜你喜欢

转载自blog.csdn.net/zyx_0604/article/details/80681198