string 简介
string,是一个专门用于操作字符串的一个类,需包含头文件
。注意与char*
的区别,char*
指向一块连续的内存,用于存放字符串,
提供了字符串操作的一些方法,如strlen/strcmp等。
string 构造
简单介绍几种声明方式,如下:
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;
}
string 属性
这里只简单介绍几个函数: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() <
string 输出
对字符串无非是整串、子串、单个字符的使用。详见注释:
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;
}
string 修改
见代码:
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
}
string 比较
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
}
string 拷贝
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;
}
string 查找和获取子串
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
}
string 交换
void StrSwap() {
string str1("ttttttttttt");
string str2("uuuuuuuuuuu");
str1.swap(str2);
cout << str1 << " " << str2 << endl;
}
string 迭代器
迭代器其实就是一个指向容器元素的指针,可以通过容器的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;
}
string 算法举例
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());//从大到小, greater()仿函数,需导入头文件
cout << endl;
for_each(str1.begin(), str1.end(), fun);
}