string,是一个专门用于操做字符串的一个类,需包含头文件<string>
。注意与char*
的区别,char*
指向一块连续的内存,用于存放字符串,<string.h>
提供了字符串操做的一些方法,如strlen/strcmp等。算法
简单介绍几种声明方式,以下:数组
void StrDefine() { string str1; cout << str1 << endl;//类对象(str1)是不能直接输出的,是由于string类中重载了运算符<<函数 string str2(5, 'a'); cout << str2 << endl; string str3("husong"); cout << str3 << endl; string str4("husong", 2); cout << str4 << endl; string str5(str3, 2, 4); cout << str5 << endl; }
这里只简单介绍几个函数:capacity()/reserve()/empty()/length()/size()/resize()。见代码注释:安全
void StrCapacity() { string str1; cout << str1.capacity() << endl;// 输出15,系统默认为空string对象申请了15个字符对象空间 string str2("husonghusonghusong"); cout << str2.capacity() << endl;// 输出31,大于15个字符时,系统又多申请了16个空间,vs编译器规律:15+16+16... // vc编译器规律:31+32+32... string str3("husong"); cout << str3.capacity() << endl;// 默认输出15 str3.reserve(20);// 输出31 str3.reserve(10);// 输出15,也就是说reserve()只能相对当前capacity大小扩大,不能缩小 //cout << str3.capacity() << endl; }
void StrEmpty() { string str1; cout << str1.empty() << endl;// 输出1,当字符串为空,empty()返回true,不然返回false string str2("husong"); cout << str2.empty() << endl;// 输出0 }
void StrLengthSize() { string str1("husong"); cout << str1.size() << endl;// 输出6 cout << str1.length() << endl;// 输出6 string str2("哈哈哈哈");// 一个汉字占2个字节 cout << str2.size() << endl;// 输出8 cout << str2.length() << endl;// 输出8 string str3("husong"); str3.resize(2);// resize()做用与string对象,capacity不会变 cout << str3 << endl;//输出hu cout << str3.length() << endl;// 输出2 cout << str3.size() << endl;// 输出2 cout<< str3.capacity() <<endl;// 输出15 }
对字符串无非是整串、子串、单个字符的使用。详见注释:app
void StrCout() { string str1("husong"); cout << str1 << endl;// 前面注释说过,其实是string内部重载了运算符<<函数 cout << str1.c_str() << endl;// c_str() 函数实际返回的是string类中的 char* 指针 string str2(str1, 0, 2); cout << str2 << endl;// 输出子串 cout << str1[1] << endl;// 输出单个字符,实际上也是重载了运算符[]函数 cout << str1.at(2) << endl; }
见代码:函数
void StrChange() { string str1("husong"); str1[1] = 's'; cout << str1 << endl; str1.at(1) = 'y'; cout << str1 << endl; //如果修改其中某段子串,可利用循环修改 }
void StrInsert() { string str1("husong"); string str2("zzzz"); str2.insert(2, str1);// 在指定index前插入,第二个参数能够为指针或引用类型 cout << str2 << endl;// 输出 zzhusongzz string str3("oooo"); str3.insert(2, str1, 2, 4);// 在指定index前插入子串 cout << str3 << endl;// 输出oosongoo string str4("iiii"); str4.insert(1, str1, 4); cout << str4 << endl;// 输出ingii str1.insert(1, 5, 'm');// 在指定index前插入n个字符 cout << str1 << endl;// 输出hmmmmmusong }
void StrAppend() { string str1("Hello"); string str2("World"); str1.append(str2);// 尾部插入字符串,参数为指针或引用 cout << str1 << endl;// 输出HelloWorld string str3("Hello"); string str4("sssJamesssssss");// 尾部插入子串 str3.append(str4, 3, 5); cout << str3 << endl;//输出HelloJames string str5("Hello"); string str6("World"); str5.append(str6, 2);// 尾部插入字符串的子串(指定位置到尾部) cout << str5 << endl;// 输出Hellorld string str7("Hello"); str7.append(3, 'p');// 尾部插入n个字符 cout << str7 << endl;// 输出Helloppp }
void StrCompare() { string str1("abcd"); string str2("abc"); string str3("abcd"); string str4("sabcd"); cout << str1.compare(str2) << endl;// 1 cout << str2.compare(str1) << endl;// -1 cout << str1.compare(str3) << endl;// 0 cout << str4.compare(3, 3, str1) << endl;// -1 cout << str4.compare(4, 2, str1, 1, 2) << endl;// 0 }
void StrCopy() { string str1("husong"); char str2[8] = {0}; str1.copy(str2, 2, 9);// 参数1:目标字符数组 参数2:拷贝长度 参数3:起始index // 这里会报错,缘由是copy方法第3个参数可能会致使str2数组越界,不安全 // 解决方式:添加#pragma warning(disable:4996),预编译时不报4996错 cout << str2 << endl; }
void StrSubStr() { string str1("husong"); string str2; str2 = str1.substr(2, 4); cout << str2 << endl;//输出song } void StrFind() { string str1("abcdefg"); string str2("def"); int index = 0; index = (int)str1.find(str2, 0);// 在str1中从0位置开始查找str2,若是找不到,转为int,结果为-1 cout << index << endl;// 输出3 }
void StrSwap() { string str1("ttttttttttt"); string str2("uuuuuuuuuuu"); str1.swap(str2); cout << str1 << " " << str2 << endl; }
迭代器其实就是一个指向容器元素的指针,能够经过容器的begin()/end()改变迭代器的指向,这里需注意迭代器失效的状况,见注释。指针
void StrIterator() { string str1("husong"); string::iterator iter = str1.begin(); for (iter; iter != str1.end(); ++iter) { cout << *iter << " "; } cout << endl; str1.append(15, 'm');// 这句代码,系统会从新分配31个字符空间(vs编译器),把原来的str1拷贝过来,但此时iter的指向并未改变 iter = str1.begin();// 把iter指向新的内存首便可 iter[1] = 'o'; cout << str1 << endl; }
void fun(char c) { cout << c <<" "; } void StrAlr() { string str1("husong"); for_each(str1.begin(), str1.end(), fun); sort(str1.begin(), str1.end());// 默认从小到大排序 cout << endl; for_each(str1.begin(), str1.end(), fun); sort(str1.begin(), str1.end(), greater<char>());//从大到小, greater<char>()仿函数,需导入头文件<functional> cout << endl; for_each(str1.begin(), str1.end(), fun); }