C++ string类—容量、元素获取
一、Capacity
- size:string类对象中字符的个数为size;
- length:size作用一样,返回string对象中有效数据个数;
- capacity:一个string对象的容量capacity决定了这个对象能存储多少字符(不包括'\0');
- max_size:表示这个string类的对象能存储的最大字符个数;
- resize:将一个string类对象的size值进行重新赋值:给定的值比size小,那么就减少string类中的数据;给定的值比size大,没有给增加的具体数据值,默认为空字符,给了具体值,那么增加的size的位置就是这些值;
- reserve:重新设置capacity的值:若是重新给定的值比原capacity大,那么就扩大capacity,并且优化大小;若是比原capacity小或者介于size和capacity之间,在VS中默认capacity的值不变;
- clear:清楚字符,使size为0;
- empty:检查string对象中是否含有字符,即判空;
- shrink_to_fit:将capacity的值调整为size;
###代码示例:
//capacity
void Capacity_Test()
{string s1("Capacity Test");//size和 length 都是返回这个字符串的字符个数cout <<"size:" << s1.size() << endl;cout <<"length:" << s1.length() << endl;cout << endl;//max_size返回这个字符串能达到的最大长度cout <<"max_size:" << s1.max_size() << endl;cout << endl;//resize改变 size 直到一个指定值,也就是有效字符个数s1.resize(12);cout << s1 << endl;//若是增大,可以设置增大位置的值,不设置,那么默认是空字符,但是不会占位s1.resize(13, 't');cout << s1 << endl;s1.resize(14);//理论上14处是空字符,后面再 resize 之后打印此处会留一个空格,但是这个空字符不占位s1.resize(20, 'i');cout << s1 << endl;cout << endl;//capacity表示字符串的容量,不算'\0'cout <<"capacity:" << s1.capacity() << endl;//观察插入字符之后,capacity的扩容string s2;for (int i = 0; i < 100; i++){s2 += 'x';if (s2.capacity() == s2.size()){cout << s2.capacity() << " ";}}cout << s2.capacity() << endl;cout << endl;//reserve表示容量设置string s3("Reserve Test");cout <<"capacity:" << s3.capacity() << endl;cout <<"size:" << s3.size() << endl;s3.reserve(13);//VS里面 reverse 的比 capacity 小,一律不改变 capacity,比 capacity 大,会扩大并且可以优化大小cout <<"capacity:" << s3.capacity() << endl;s3.reserve(30);cout << "capacity:" << s3.capacity() << endl;cout << endl;//clear表示清空 sizestring s4("Clear Test");cout <<"size:" << s4.size() << endl;s4.clear();cout <<"size:" << s4.size() << endl;cout << "capacity:" << s4.capacity() << endl;cout << endl;//empty判空,即看 size 是否为0 (true if the string length is 0, false otherwise)string s5("Empty Test");s5.empty() ? cout << "true" << endl : cout << "false"<<endl;string s6;s6.empty() ? cout << "true" << endl : cout << "false" << endl;cout << endl;//shrink_to_fit表示将 capacity 调整为 size 大小。但是不是强制性的,在VS里面将 capacity 不会比当前的值小string s7("Shrink_To_Fit_Test");cout << "size:" << s7.size() << endl;cout << "capacity:" << s7.capacity() << endl;s7.shrink_to_fit();cout << "capacity:" << s7.capacity() << endl;cout << endl;
}
###运行结果:
二、Element access
这些成员函数是获取string类里面的元素的;
- operator[]:重载[],使string对象可以通过[]加下标的方式访问string里面的元素;
- at:和operator[]类似,但是访问元素时写成,s1.at(0)(s1为string对象,0为下标);
- front:获取string类对象的第一个数据;
- back:获取string对象的最后一个有效数据;
###代码示例:
void Element_access()//此中的函数返回值都是引用,所以可以通过返回值改变原字符串中对应的字符;但若是 const 限制的就不能改变
{//operator[]cout << "operator测试:" << endl;//重载[],让字符串可以通过下标的方式访问字符string s1("Operator_Test");// 输出O,第一个字符cout << s1[0] << endl;//若是'\0',则输出空字符cout << s1[s1.size()] << endl; //非 const 的 string 类可以通过下标改变此处的字符s1[0] = 'L';cout << s1 << endl;//const类型的 string 不能通过改变const string s2(s1);//s2[0] = 'O'; //报错cout << endl;//atcout << "at测试:" << endl;//at通过下标访问,越界则会引发异常(out_of_range)string s3("At_Test");for (size_t i=0;i<s3.size();i++){cout << s3.at(i);}cout << endl;//s3.at(100) = 'i';s3.at(0) = 'X';cout << s3 << endl;cout << endl;//back//back返回 string 类对现象的最后一个有效字符;不能使用在空字符串上面cout << "back测试:" << endl;string s4("Hello World.");cout << s4 << endl;s4.back() = '!';cout << s4 << endl;//若是空的 string 类,则报错(call on empty string)//string s5;//cout << s5.back() << endl;cout << endl;//front //返回 string 类对象中的第一个字符,若是空 string 对象,报错string s6("front_Test");cout << s6 << endl;s6.front() = 'F';cout << s6 << endl;
}
###运行结果: