加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

C++string中有关大小和容量的函数畅聊

发布时间:2021-11-19 14:39:50 所属栏目:教程 来源:互联网
导读:1.length()与size() length是因为沿用C语言的习惯而保留下来的,string类最初只有length,引入STL之后,为了兼容又加入了size,它是作为STL容器的属性存在的,便于符合STL的接口规则,以便用于STL的算法。 string类的size()/length()方法返回的是字节数,不

1.length()与size()
 
length是因为沿用C语言的习惯而保留下来的,string类最初只有length,引入STL之后,为了兼容又加入了size,它是作为STL容器的属性存在的,便于符合STL的接口规则,以便用于STL的算法。 string类的size()/length()方法返回的是字节数,不管是否有汉字。
 
两者原型如下:
 
 size_type  __CLR_OR_THIS_CALL  length()  const   
 
{ //  return  length  of  sequence   
 
return  (_Mysize);   
 
}       
 
size_type  __CLR_OR_THIS_CALL  size()  const   
 
{ //  return  length  of  sequence   
 
return  (_Mysize);   
 
}       
 
可见两者没有区别。
 
2.capacity()
 
对这个函数的理解为: 当我们定义了一个string变量,如string str("abcdefg");或string str1="abcdefg";那么编译器就会为它分配空间,而capacity()返回的就是这个空间的大小(按字节算)。通常实际分配的空间比字符串的实际长度要大。这是一种优化,因为当我们再向原串加入一些字符(不超过原来的capacity()值)的话,就不用再次分配空间了。从下面的例子可以看出,当string变得比较大时,空间分配并不再遵循n*16-1这样的规律,空间分配变得不是那么大方了。另外,并不是所有的编译器都会为string多分配空间,比如CodeBlocks12.11上(GCC编译器),string str1 = "ab";cout << str1.capacity() << endl;的结果就是2.
 
以下结果来自VS2013
 
#include<iostream>
 
#include<string>
 
#include<fstream>
 
using namespace std;
 
int main()
 
{
 
      string str1 = "ab";
 
      cout << str1.capacity() << endl;//15
 
      str1 += "c";
 
      cout << str1.capacity() << endl; //15
 
      str1 += "defghi";
 
      cout << str1.capacity() << endl;//15
 
      str1 += "haohao";//等于15个
 
    cout << str1.capacity() << endl;//15
 
    str1 += "x";//超过15个
 
    cout << str1.capacity() << endl;//31
 
    ifstream readfile("zpc2.txt", ios::in);
 
    if (!readfile){ cout << "程序出现异常,自动退出!" << endl; return 0; }
 
    string str, str2;
 
    while (!readfile.eof())
 
    {
 
          getline(readfile, str2);
 
          str += str2;  str += ' ';
 
    }
 
    readfile.close();
 
    cout << str.length() << endl;//913
 
    cout << str.capacity() << endl;//1126
 
    return 0;
 
}
 
3.reserve()
 
原型: void reserve(    size_type _Count = 0 );
 
功能:函数reserve()将字符串的容量设置为至少size. 如果size指定的数值要小于当前字符串中的字符数(亦即size < this→size()), 容量将被设置为可以恰好容纳字符的数值。它最大的      用处是为了避免反复重新分配缓冲区内存而导致效率降低,或者在使用某些STL操作(例如std::copy)之前保证缓冲区够大。但在有些编译器上,reserve()并不怎么起作用。
 
#include<iostream>
 
#include<string>
 
using namespace std;
 
struct Mystr
 
{
 
    string str;
 
    Mystr()
 
    {
 
          str = "abcdefiunyhiluyntv5eco8unmomusb nbjhg bj  kkiubhno";
 
          str.reserve(20);
 
    }
 
};
 
int main()
 
{
 
    string str1 = "abcd";
 
    str1.reserve(6);
 
    cout << str1.length() << endl;//4    4
 
    cout << str1.capacity() << endl;//15  8
 
    string str2 = "abcd";
 
    str1.reserve(50);
 
    cout << str2.length() << endl;//4  4
 
    cout << str2.capacity() << endl;//15  4
 
    string str3;
 
    str3.reserve(6);
 
    cout << str3.length() << endl;//0  0
 
    cout << str3.capacity() << endl;//15  6
 
    Mystr mystr;
 
    cout << sizeof(mystr) << endl;//28  4
 
    return 0;
 
}
 
上面的输出结果中,前一个来自于VS2013,后一个来自于CodeBlocks12.11。
 
从输出结果来看,reserve()的结果毫无规律可循,并且似乎并没有起到它应有的效果。
 
所以,根据以上情况,对于capacity()和reserve(),我们的态度是:能不用就不用。即使要用,也要实现确定它们在当前环境下的表现。
 
4.resize()
 
原型:
 
void resize( size_type size, char val = char() );
 
功能: 改变原有字符串的长度,size指定新长度,当size大于原长度时,多出的部分用val来填充,如果为指定val,则val默认为空格;当size小于原长度时,从开
 
          始起截取size个字符,即相当于把后面的部分删除。
 
#include<iostream>
 
#include<string>
 
using namespace std;
 
struct Mystr
 
{
 
    string str;
 
    Mystr()
 
    {
 
          str = "abc";
 
          str.resize(9);
 
    }
 
};
 
int main()
 
{
 
      string str1 = "ab";
 
      str1.resize(6);
 
      cout << str1 << endl;//ab+4个空格  ab+4个空格
 
      cout << str1.length() << endl;//6  6
 
      cout << str1.capacity() << endl;//15  6
 
      string str2 = "abcdefg";
 
      str2.resize(5);
 
      cout << str2 << endl;//abcde  abcde
 
      cout << str2.length() << endl;//5  5
 
      cout << str2.capacity() << endl;//15  7
 
      string str3 = "abc";
 
      str3.resize(5, 'a');
 
      cout << str3 << endl;//abcaa  abcaa
 
      cout << str3.length() << endl;//5  5
 
      cout << str3.capacity() << endl;//15  6
 
      string str4 = "abcdefg";
 
      str4.resize(5, 'a');//此时'a'将不起作用
 
      cout << str4 << endl;//abcde  abcde
 
      cout << str4.length() << endl;//5  5
 
      cout << str4.capacity() << endl;//15  7
 
      Mystr mystr;
 
      cout << sizeof(mystr) << endl;//28  4
 
      return 0;
 
}
 
以上两个输出对应的环境同上。
 
5.max_size()
 
返回string对象最多可包含的字符数。当程序执行了长度超过max_size()的string操作,编译器会抛出length_error异常。max_size()的值与编译器有关,对于不同的编译器,max_size()的值不一定相同。
 
#include<iostream>
 
#include<string>
 
using namespace std;
 
int main()
 
{
 
      string str1 = "abcdefg";
 
      cout << str1.max_size() << endl;//4294967294  1073741820
 
      str1.resize(4294967300);//出现警告  无警告无错误
 
      return 0;
 
}
 
以上两个输出对应的环境同上。

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读