string
string是专门的字符串操作的一个类
string str ;
cout << str ;
- 有参数的: string( size_type length, char ch )
string str2(6,'r');
cout<< str2 ;
输出6个r
string str2("ajbdjg");
cout<< str2 ;
输出ajbdjg
- empty(),判断字符串是否为空,空返回true, 非空返回false
string str ;
cout << str.empty() ;
就会输出0,表示空
- 拷贝构造:string(const string& str);
string str2("abcdefg");
cout << str2 << endl;
表示将str2的下标2开始,看后面三个拷贝给str4
string str4(str2, 2, 3);
cout << str4 << endl;
将str2全部拷贝给str5
string str5(str2);
cout << str5 << endl;
属性
容量
- capacity()
当我们申请一个字符串的时候,当长度不超过15的时候,会给你15个容量,当超过15个,会在15个容量的基础上,增加16个,只有额度不够就会增加16N个
string str1(5, 'a');
查看str1的容量
cout << str1.capacity() << endl;
容量为15
Visual Studio2019,少于15个,申请15个容量(至少申请15个),以后多余容量就增加16个大小 VC++6.0 是至少申请31个空间,以后每次增加32个
容量的修改,不能变小,只能变大,当把容量变为18的时候,最终为31(15+16N)
- length():字符串长度
- size():字符个数
- resize():重新设置字符个数
当对一个长度为8的字符串,重设字符长度为3,字符串会仅保留前三个字符,length(),size()都会被设为2,容量依然为15
输出
string str2("abcdefg");
cout << str2 << endl;
str2是一个对象,虽然输出str2能输出字符串,但是str2不是一个字符串
能输出字符串是应为str2的类里面重载了输出
string str2("abcdefg");
cout << str2.c_str() << endl;
cout << str2[1] << endl;
string str2("abcdefg");
str2.at(3);
返回d
如果at的下标越界,会抛出异常
修改
修改指定元素
string str2("abcdefg");
str2[2] = 's';
str2.at(3) = 'q';
中间插入
关键词:insert
basic_string &insert( size_type index, const basic_string &str );
basic_string &insert( size_type index, const char *str );
basic_string &insert( size_type index1, const basic_string &str, size_type index2, size_type num );
basic_string &insert( size_type index, const char *str, size_type num );
basic_string &insert( size_type index, size_type num, char ch );
举例:
string str2("abcdefg");
str2.insert(str2.length(), 3, 'b');
尾插(拼接)
关键词:append 符号:+=
语法和中间插入相同
basic_string &append( const basic_string &str );
basic_string &append( const char *str );
basic_string &append( const basic_string &str, size_type index, size_type len );
basic_string &append( const char *str, size_type num );
basic_string &append( size_type num, char ch );
举例:
string str2("abcdefg");
string str3("abcdef");
str2 += str3;
str2 += "qweqwe";
str2.append(2, 'w');
重新赋值
关键词:assign 语法和中间插入相同
basic_string &assign( const basic_string &str );
basic_string &assign( const char *str );
basic_string &assign( const basic_string &str, size_type index, size_type len );
basic_string &assign( const char *str, size_type num );
basic_string &assign( size_type num, char ch );
举例:
string str2("abcdefg");
string str3("abcdef");
str2 = str3;
cin >> str2;
str2.assign("qweer", 2);
str2.erase(0, str2.length());
cout << str2 << endl;
删除
关键词:erase
basic_string &erase( size_type index = 0, size_type num = npos );
erase(0, str2.length());
比较
a > b 返回 1,a < b 返回-1,a == b 返回0
关键词:compare
string str2("aabrweq");
string str3("abr");
cout << (str2 <= str3) << endl;
cout << str2.compare("asd") << endl;
复制
关键词:copy
将对象中的某一段复制进一个字符数组中
size_type copy( char *str, size_type num, size_type index );
举例:从str2中下标为3的位置向后复制5个字符到arrStr中
str2.copy(arrStr, 3, 5);
#pragma warning(disable:4996) //全部关掉
查找子串
从指定index位置开始查找str,,找到就返回起始位置 size_type find( const basic_string &str, size_type index );
从指定位置查找一个字符串 size_type find( const char *str, size_type index );
从指定位置开始查找字符 size_type find( char ch, size_type index );
找到返回下标的位置,找不到返回-1
举例:
string str1("abcdefg");
string str2("abc")
从str1下标为0的位置查找str2
cout << str1.find(str2,0)
结果返回0,下标为0的位置
交换
关键词:swap
交换str2
str2.swap(str3);
string迭代器
迭代器是连接容器和算法的中间键,每一个容器都有一个自己的迭代器
定义一个string的迭代器
string::iterator 迭代器名;
- 迭代器就相当于一个指向string对象元素的指针,本质上相当于 一个char* 的指针
string str("abcdefg");
string::iterator ite;
ite = str.begin();
end()返回的是我们的迭代器最后元素的下一个位置
迭代器用的函数和char*所用的函数不一样
string str("abcdefg");
ite = str.begin();
for (ite; ite != str.end(); ite++)
{
cout << *ite << " ";
ite++ ;
}
和char*的使用方法一样还可以自加
还可以通过下标运算的方式运算
for (size_t i = 0; i < str.size(); i++)
{
cout << *ite << " ";
ite++;
}
通过指针赋值
都赋值为a
for (ite = str.begin();ite != str.end(); ite++)
{
*ite = ‘a’;
}
通过下标赋值
for (size_t i = 0;i < str.size(); i++)
{
ite[i] = 'a';
}
- 所以可以看出来,这个迭代器定义方法跟指针不一样,用法跟指针一样
定义了一个指向 string 对象的元素的指针为什么不定义成char*呢, 因为我们这个迭代器是要跟算法连接的,它适用于所有的容器,即一个通用类型的指针,或者类似叫智能指针
- 迭代器失效
string重新申请空间的时候,迭代器会失效
string str("abcdefg");
string::iterator ite;
ite = str.begin();
str.append(15, 'a');
原来str是15个控件,然后又追加15个元素,容量不够,需要从新申请空间,这时,ite迭代器会失效
ite[4] = 'w';
要从新赋一下值
ite = str.begin();
迭代器失效与否,与是否申请了新的控件有关,例如数组往里面增加了 过多的东西,就会失效,但是链表不会失效
string算法
for_each(循环)
循环输出字符串
用for_each输出一个字符串
fun函数的参数类型就是元素的类型
int fun(char c)
{
cout << c;
return 0;
}
string str("qweasdzxc");
for_each(str.begin(), str.end(), fun);
也可以用一个for循环带起
string str("abcdefg");
string::iterator ite;
ite = str.begin();
for (ite; ite != str.end(); ite++)
{
cout << *ite << " " ;
}
sort(排序)
两个参数排序,将str排序,默认从小到大排序
string str("qweasdzxc");
sort(str.begin(), str.end());
for_each(str.begin(), str.end(), fun);
int fun(char c)
{
cout << c;
return 0;
}
三个参数排序,可以是字符串从大到小排列
string str("qweasdzxc");
sort(str.begin(), str.end(), greater<char>());
|