c++ String 类函数详解
总算抽出时间把string类里的函数好好研究一遍,在VS2013里完整运行了一遍,加深了一下理解:
代码块
#include < iostream >
#include < string >
using namespace std;
void main()
{
string s = "asdssfghjkl";
char a1;
string::iterator it;
string::const_iterator cit;
string::size_type n;
s.append("zxcv"); //s="asdssfghjklzxcv",参数必须为string类型 不可为char。
s.assign("qwert"); //s="qwert",相当于赋值操作,赋以新值 ,参数不可为char。
a1 = s.at(0); //a1='q' 下标操作
a1 = s.back(); //a1='t' 返回最后一个字符
it = s.begin(); //返回字符串起始位置的迭代器,cit = s.begin(); 正确
a1=it[0]; //s ="qwert", a1='q',a=cit[0]; 正确
it[3] = 'f'; //s ="qweft",cit[3] = 'f'; 错误
n = s.capacity(); //s="qwert" n=15(win64 vs2013)
/*
给字符串分配内存的时候,并不是有多大长度分配多少的,考虑到append等操
作,一次分配内存是比给他的字符串长度多的。这样在append的时候,就不用
每次都分配内存了。除非append时,已分配内存不够了,会再次追加一次内存
分配。当前已经分配的内存大小,就是capacity。字符串实际大小,就是
size。这样做是为了提高字符串操作效率。capacity是容量,是可存放字符
的个数。size是大小,是当前已存放字符的个数。capacity >= size, 具
体capcacity大多少,具体的stl库实现决定。capacity是可增大的,如果当
前size加上要加入的字符个数超过capacity,capacity就要增大,一般翻倍
增长,具体取决于实现。
*/
cit=s.cbegin(); //s="qweft",返回字符串起始位置的const型迭代器
a1 = cit[1]; // a1='w'
/*
1.iterator,const_iterator作用:遍历容器内的元素,并访问这些元素的
值。iterator可以改元素值,但const_iterator不可改。跟C的指针有点像
2.const_iterator 对象可以用于const vector 或非 const vector,它
自身的值可以改(可以指向其他元素),但不能改写其指向的元素值. 如 cit[1]
= 'o' 错误
*/
cit = s.cend(); //cit = " ",返回字符串末尾的 const型迭代器
s.clear(); //删除字符串里的所有字符
s = "asdfg";
int n1=s.compare("asdfg"); //n1=0 字符串比较
int n2 = s.compare("sdfg"); //n1=-1
int n3 = s.compare("ab"); //n1=1
char* sdest;
n=s.copy(sdest,1,0); //会报unsafe的问题
/*
size_type copy( CharT* dest, size_type count, size_type
pos = 0);
参数:
dest pointer to the destination character string
pos position of the first character to include
count length of the substring
返回值:
copy的字符个数
从string类型对象中至多复制count个字符到字符指针dest指向的空间中。默
认从首字符开始,但是也可以指定,开始的位置(记住从0开始)。返回真正从对
象中复制的字符。用户要确保p指向的空间足够保存n个字符。
*/
string::const_reverse_iterator it2;
it2=s.crbegin(); /*返回const翻转迭代器,将s先翻转,再取其begin。
it2[2] = 'g';错误。it2=" ",相当于取到s的最后一个元素 ++是往s的前
面取。*/
a1 = it2[0]; //a1='g'
a1 = it2[1]; //a1='f'
it2 = s.crend(); /*返回const翻转迭代器,将s先翻转,再取其end。
it2 = "asdfg"; char a3 = it2[0]; char a4 = it2[1]; 错误溢出。
相当于取到s的第一个元素前一个。与cbegin cend 相反。*/
const char* s1;
s1=s.c_str(); /*s1="asdgf",c_str()返回的是一个临时指针,不能
对其进行操作,s中字符删除s1也就没了,s1是c字符串,末尾追加\0。*/
/*
const char* c;
string s="1234";
c = s.c_str();
cout<<c<<endl; //输出:1234
s="